Как заставить Apache Tomcat принять метод DELETE
Я работаю над проектом веб-сервисов RESTful, я использую Apache Tomcat и JAX-RS.
Я хочу принимать запросы DELETE от клиента, но всякий раз, когда я отправляю запрос DELETE из расширенного клиентского модуля Chrome REST, он дает код ответа 403 Forbidden.
Итак, как я могу заставить Apche Tomcat принять DELETE-запрос?
Ответы
Ответ 1
Tomcat блокировал методы DELETE для меня из-за моих фильтров CORS.
Мне нужны новые фильтры, зарегистрированные в моем файле web.xml. Вот пример очень разрешительного:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Accept,Accept-Encoding,Accept-Language,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization,Connection,Content-Type,Host,Origin,Referer,Token-Id,User-Agent, X-Requested-With</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET, POST, PUT, DELETE, OPTIONS, HEAD</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ответ 2
Вот причины, по которым вы можете получить 403 Forbidden от Tomcat для запроса DELETE:
В каждом запросе HTTP DELETE, обрабатываемом этим сервлетом, следующее обработка должна выполняться:
-
Если изменения в статических ресурсах не разрешены (заданы параметром конфигурации), возвращайте статус HTTP 403 (запрещено).
-
Если предпринимается попытка удалить ресурс из /META -INF или/WEB-INF, вернуть статус HTTP 403 (запрещено).
-
Если запрошенный ресурс не существует, верните статус HTTP 404 (не найден)
-
Отвяжите ресурс из контекста каталога, содержащего статические ресурсы для этого веб-приложения. В случае успеха верните Статус HTTP 204 (без содержимого). В противном случае вернуть статус HTTP 405 (метод не разрешен).
Источник: http://tomcat.apache.org/tomcat-5.5-doc/catalina/funcspecs/fs-default.html
Убедитесь, что вы придерживаетесь спецификаций tomcat, чтобы избежать каких-либо проблем.
Ответ 3
Еще одно предложение, дважды проверьте URL-адрес своего вызова и убедитесь, что он указывает на ваш предполагаемый сервлет.
Я получил ту же ошибку, когда я ошибся URL-адрес службы в своем коде. У меня было api/roles/Service/roles
, когда мне нужно было api/rolesService/roles
, исправление опечатки разрешило ошибку. Вы ожидали бы 404, но с DELETE на Tomcat вы получите 403.
Ответ 4
Чтобы включить другие методы http в tomcat, настройте в web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Параметры debug
и listings
загружаются по умолчанию в tomcat, а по умолчанию readonly
- true, что означает, что доступны только GET и POST.
Другие доступные параметры:
debug Debugging detail level for messages logged
by this servlet. [0]
fileEncoding Encoding to be used to read static resources
[platform default]
input Input buffer size (in bytes) when reading
resources to be served. [2048]
listings Should directory listings be produced if there
is no welcome file in this directory? [false]
WARNING: Listings for directories with many
entries can be slow and may consume
significant proportions of server resources.
output Output buffer size (in bytes) when writing
resources to be served. [2048]
readonly Is this context "read only", so HTTP
commands like PUT and DELETE are
rejected? [true]
readmeFile File to display together with the directory
contents. [null]
sendfileSize If the connector used supports sendfile, this
represents the minimal file size in KB for
which sendfile will be used. Use a negative
value to always disable sendfile. [48]
useAcceptRanges Should the Accept-Ranges header be included
in responses where appropriate? [true]