Как заставить 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]