Jquery POST donnant 403 erreur interdite au spring MVC

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é.