2016-04-02 36 views
7

Sto utilizzando la jersey come mia implementazione di API riposante. Nel front-end, sto usando il servizio $ http di angularjs per fare una richiesta http. Quando richiedo un metodo di eliminazione, ho sempre ricevuto un errore.Sempre ottenuto Il metodo DELETE non è consentito da Access-Control-Allow-Methods nella risposta di preflight

"Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response." 

Ho letto alcuni articoli e dicono che ho bisogno per consentire eliminare il "Access-Control-Allow-Metodi". Ho impostato il filtro di risposta come sotto ma ha ancora tale problema. Cos'altro dovrei fare?

@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", "*"); 
    } 
} 

sotto è il mio codice angolare per effettuare la richiesta:

$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

Avete registrato il provider nel vostro 'web.xml' o classe di applicazione? – Casey

+0

Sto usando spring-boot e funziona con altri metodi come GET, POST. Fallito solo su DELETE –

risposta

12

Dopo alcuni test, ho trovato la soluzione. Metto il metodo allow sull'intestazione come di seguito, quindi funziona. Non so perché "*" non funzioni.

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

In realtà mi sono imbattuto nello stesso problema, ma dopo aver dato un'occhiata alla documentazione https://www.w3.org/TR/cors/#access-control-allow-methods-response-header non so come potrei pensare che "*" possa funzionare per l'intestazione allow-methods. – JepZ

0

Provare a utilizzare l'estensione per Chrome CORS, mi ha aiutato una volta.

EDIT

Questo accade perché angolare aggiunge i tasti X-Header nelle intestazioni delle richieste.

X-Header generalmente definiscono o impostare i parametri di funzionamento per REQ HTTP/res

È possibile risolvere questo problema modificando il Content-Type delle richieste di "text/plain" o "application/x-www-form-urlencoded" o "multipart/form-data".

È possibile farlo utilizzando un intercettore mentre si è nella configurazione dell'app.

EDIT

Aggiungi questo al vostro codice del server -

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

provare a cambiare il tipo di contenuto per text/plain

Spero che questo aiuti .

+0

Ma non risolve altri browser giusto? –

+0

Il fatto è che, in un ambiente di produzione, probabilmente non avrai questo problema ... c'è una soluzione molto semplice ma dimmi se ora funziona in Chrome? – atefth

+0

Sfortunatamente, non funziona. Ma perché hai detto che non avrò questo problema nell'impostazione della produzione? –