2016-04-02 8 views
7

Ich benutze Jersey als meine erholsame API-Implementierung. Im Frontend verwende ich angularjs $ http-Service, um http-Anfragen zu stellen. Wenn ich eine Löschmethode anfordere, habe ich immer einen Fehler unterschritten.Always hole Methode DELETE ist nicht erlaubt von Access-Control-Allow-Methoden in Preflight-Antwort

Ich lese einige Artikel und sie sagen, ich muss löschen auf "Access-Control-Allow-Methoden" zulassen. Ich habe den Antwortfilter wie folgt eingerichtet, aber es hat immer noch ein solches Problem. Was soll ich sonst machen?

@Provider 
public class CORSResponseFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     MultivaluedMap<String, Object> headers = responseContext.getHeaders(); 

     headers.add("Access-Control-Allow-Origin", "*"); 
     headers.add("Access-Control-Allow-Methods", "*"); 
    } 
} 

unten ist mein Winkel Code, um die Anfrage zu machen:

$http({ 
      method: 'DELETE', 
      url: remoteUrl, 
      headers : {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', 
       'ACCESS_TOKEN' : $cookieStore.get("access_token") 
      }, 
      data : $httpParamSerializer({ 
       'id':id 
      }) 
     }).success(function(data,status,headers,config) { 
      $scope.refreshDepartments(); 
      console.log(data); 
      alert("success"); 
     }).error(function(data,status,headers,config){ 
      console.log(data); 
      alert("error"); 
     }); 
+0

Haben Sie den Anbieter in Ihrer 'web.xml'- oder Anwendungsklasse registriert? – Casey

+0

Ich benutze Spring-Boot und es funktioniert für andere Methode wie GET, POST. Nur gescheitert auf DELETE –

Antwort

12

Nach einigen Tests fand ich die Lösung. Ich setze die Methode allow auf den Header wie folgt, dann funktioniert es. Ich weiß nicht, warum "*" nicht funktioniert.

headers.add("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE"); 
+0

Eigentlich hatte ich das selbe Problem, aber nach einem Blick in die Dokumentation https://www.w3.org/TR/cors/#access-control-allow-methods-response-header weiß ich nicht wie ich könnte denken, dass "*" für den Header allow-methods funktionieren könnte. – JepZ

0

Versuchen Sie, die CORS-Erweiterung für Chrome, es half mir einmal.

EDIT

Dies geschieht, weil Winkel X-Header Schlüssel in der Request-Header hinzufügt.

X-Headers im Allgemeinen definieren oder die Betriebsparameter festgelegt für den HTTP-req/res

Sie können dieses Problem beheben, indem Sie den Content-Type Ihrer Anfragen zu "text/plain" Modifizieren oder "application/x-www-form-urlencoded" oder "multipart/form-data".

Sie können dies tun, indem Sie in Ihrer App-Konfiguration einen Interceptor verwenden.

EDIT

Fügen Sie diesen Code auf dem Server -

header('Access-Control-Allow-Headers: X-Requested-With'); 

Versuchen Sie, den Content-Type auf text/plain

Hoffnung zu ändern, das hilft .

+0

Aber es löst andere Browser nicht richtig? –

+0

Die Sache ist, in einer Produktionsumgebung wirst du dieses Problem wahrscheinlich nicht haben. Es gibt eine sehr einfache Problemumgehung, aber sag mir, ob es jetzt in Chrome funktioniert? – atefth

+0

Leider funktioniert es nicht. Aber warum hast du gesagt, dass ich kein Problem in der Produktion habe? –