web-dev-qa-db-fra.com

La méthode DELETE toujours obtenue n'est pas autorisée par Access-Control-Allow-Methods dans la réponse de contrôle en amont

J'utilise jersey comme application api reposante. Au début, j'utilise le service angularjs $ http pour faire une requête http. Lorsque je demande une méthode de suppression, j'ai toujours l'erreur ci-dessous.

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

J'ai lu quelques articles et ils disent que je dois autoriser la suppression sur "Access-Control-Allow-Methods". J'ai configuré le filtre de réponse comme indiqué ci-dessous, mais le problème persiste. Que dois-je faire d'autre?

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

ci-dessous est mon code angulaire pour faire la demande:

$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");
        });
11
Zhao Yi

Après quelques essais, j'ai trouvé la solution. Je mets la méthode allow sur l'en-tête comme ci-dessous, alors cela fonctionne. Je ne sais pas pourquoi "*" ne fonctionne pas.

headers.add("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
16
Zhao Yi

Essayez d’utiliser l’extension CORS pour le chrome, cela m’a aidé une fois.

MODIFIER

Cela se produit car angular ajoute des clés X-Header dans vos en-têtes de requête.

Les en-têtes X définissent ou définissent généralement les paramètres de fonctionnement pour les requêtes HTTP. 

Vous pouvez résoudre ce problème en modifiant le type de contenu de vos requêtes en "text/plain" ou "application/x-www-form-urlencoded" ou "multipart/form-data".

Vous pouvez le faire en utilisant un intercepteur dans la configuration de votre application.

MODIFIER

Ajoutez ceci à votre code serveur -

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

Essayez de changer le type de contenu en text/plain

J'espère que cela t'aides.

0
atefth