2013-07-25 22 views
9

Pracuję nad projektem RESTful web services, używam Apache Tomcat i JAX-RS.Jak sprawić, aby Apache Tomcat zaakceptował metodę DELETE

Chcę akceptować żądania DELETE od klienta, ale za każdym razem, gdy wysyłam żądanie DELETE z wtyczki klienta Advanced REST do przeglądarki Chrome, kod odpowiedzi 403 jest zabroniony.

Jak mogę sprawić, by Apche Tomcat zaakceptowała prośbę DELETE?

+1

Tak, mam te same problemy z moją konfiguracją.Próbowałem ustawić domyślny Servlet na readOnly = false, ale nadal nie pomaga. Na razie uciekłem się do używania POST + GET –

Odpowiedz

2

Oto powody, dla których można uzyskać 403 Forbidden z Tomcat dla DELETE życzenie:

Na każdym HTTP DELETE żądanie przetwarzane przez tego apletu, następujące przetwarzanie odbywa się:

  • Jeśli modyfikacje statycznych zasobów są niedozwolone (ustawione przez parametr konfiguracyjny), zwróć stan HTTP 403 (zabroniony).

  • Jeśli zostanie podjęta próba usunięcia zasobu z/META-INF lub/WEB-INF, zwróć stan HTTP 403 (zabroniony).

  • Jeśli żądany zasób nie istnieje, stan powrotu HTTP 404 (nie znaleziono)

  • Rozwiążcie zasób z kontekstu katalogu zawierającego zasoby statyczne dla tej aplikacji internetowej. Jeśli się powiedzie, zwróć stan HTTP 204 (brak treści). W przeciwnym razie zwróć stan HTTP 405 (metoda niedozwolona).

Źródło: http://tomcat.apache.org/tomcat-5.5-doc/catalina/funcspecs/fs-default.html

Upewnij się przestrzegać specyfikacji Tomcat uniknąć wszelkich problemów.

+0

Pytanie wspomina o JAX-RS, więc dlaczego to ma znaczenie? – mthmulders

+2

@mthmulders JAXRS lub inne frameworki usług sieciowych znajdują się za przechwytującym żądanie tomcat. Jeśli tomcat odrzuca żądania z poziomu kontenera, twój kod jaxrs nie zostanie wykonany. –

8

Tomcat blokował mi metody DELETE z powodu moich filtrów CORS.

Potrzebowałem nowych filtrów zarejestrowanych w moim pliku web.xml. Oto przykład z bardzo liberalne jednym:

<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> 
0

Aby włączyć inne metody HTTP w Tomcat, należy skonfigurować w 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> 

Parametry debug i listings są załadowane domyślnie w Tomcat, natomiast domyślnie readonly jest prawdziwe, co oznacza, że ​​dostępne są tylko GET i POST.

Inne params dostępne są:

 
    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]   

+1

Nadal nie działa :( – laike9m

+0

Może coś nie tak z twoim środowiskiem.To działa nie tylko dla mnie, ale dla innych, którzy mnie głosują .. Dlaczego mnie głosowałeś? – Moesio

+0

Rozwiązałem mój problem, okazało się, że nie zrobiłem tego t naprawdę wysłać żądanie DELETE – laike9m

2

Jeszcze jedna sugestia, podwójnie sprawdzić adres URL połączenia i upewnij się, że wskazuje na planowaną serwletu.

Wystąpił ten sam błąd, gdy błędnie wpisano adres URL usługi w moim kodzie. Miałem api/roles/Service/roles, kiedy potrzebowałem api/rolesService/roles, naprawiając literówkę rozwiązałem błąd. Spodziewałbyś się 404, ale z DELETE na Tomcat dostałeś 403.