Je souhaite effectuer un appel ajax à l’aide de $ .POST. Mais je reçois une erreur 403. Mais GET fonctionne parfaitement bien. Mon code est:
var url = "/xyz/abc/subscribe?name="+name; $.post(url, function(data){ alert(data); });
Le code du contrôleur est:
@RequestMapping(value = "/xyz/abc/subscribe", method = RequestMethod.POST) public @ResponseBody Ssortingng subscribe(@RequestParam("name") Ssortingng name) throws Exception { Ssortingng message = "TESTING"; return message; }
Mais je reçois une erreur 403.
Avec la sécurité Spring avec la configuration Java, la protection CSRF est activée par défaut. Dans ce contexte, si vous adressez une demande Ajax à un sharepoint terminaison REST à l’aide de la méthode POST, vous obtiendrez une erreur manquante du jeton csrf.
Pour résoudre ce problème, il existe deux options:
Option 1: Désactiver CSRF
@Override protected void configure (HttpSecurity http) throws Exception { http.csrf().disable(); }
Option 2: Ajoutez csrf à la demande ajax. Voir ici
Vous voudrez peut-être append le jeton csrf à la demande.
L’obtention du jeton à l’aide de JSTL devrait être assez simple. Si vous utilisez Thymeleaf, voici comment vous en procurer.
Ensuite, ajoutez-le à votre demande:
var requestData = { 'paramA': paramA, 'paramB': paramB, }; requestData[_csrf_param_name] = _csrf_token; // Adds the token $.ajax({ type: 'POST', url: '...your url...', data: requestData, ... });
Si tout se passe bien, la requête doit inclure quelque chose comme _csrf: 1556bced-b323-4a23-ba1d-5d15428d29fa (le jeton csrf) et vous obtiendrez un 200 au lieu de 403.
Si vous regardez le code source de CSRFilter, vous verrez que le filtre attend csrfToken dans l’en-tête ou le paramètre de requête. Dans ma configuration, la clé “_csrf” était la bonne clé dans le paramètre de requête. Donc, j’ai ajouté ce paramètre dans mon post appel.
var csrfCookie = getCsrfCookie(); alert(csrfCookie); function getCsrfCookie() { var ret = ""; var tab = document.cookie.split(";"); if(tab.length>0){ var tab1 = tab[0].split("="); if(tab1.length>1) { ret =tab1[1]; } } return ret; } $http.post('/testPost?_csrf='+csrfCookie).success(function (response) { alert("post : "+response); return response; });
Vous essayez d’envoyer une demande POST à un noeud final REST auquel vous n’êtes pas autorisé. Soit votre session est devenue invalide, soit l’utilisateur que vous vous connectez n’a pas l’autorité comme @geo et déjà indiqué.