Ajax afficher les résultats dans une 405 (Méthode Non Autorisée) - Spring MVC
Je suis en train de faire un appel ajax de mon Ressort contrôleur/action avec la méthode POST, et retourne un objet à partir du serveur avec @ResponseBody. La situation étrange, c'est qu'il ne fonctionne plus après l'ajout de printemps couche de sécurité, tout fonctionnait bien avant. Je vais essayer d'expliquer mes démarches pour résoudre le problème, puis vous montrer le code/captures/etc.
1.
Après quelques recherches, j'ai trouvé quelques réponses disant que le problème est peut être lié avec csrf mécanisme, donc je l'ai désactivé et j'ai toujours le problème. (spring-security.xml ci-dessous)
2.
J'ai fait une capture wireshark pour vérifier la demande/réponse. Ma requête ajax est OK, mon contrôleur de déclaration est OK, mais je ne comprends pas pourquoi, la 405 réponse indique > Permettre: OBTENIR (capture ci-dessous)
3.
J'ai essayé d'accéder à mon contrôleur de l'action par le biais du navigateur (c'est à dire, faire une requête GET), et j'obtiens l'erreur d'État HTTP 405 - Demande de la méthode " GET " non pris en charge!
4.
J'ai essayé de changer la RequestMapping(méthode...) à RequestMethod.OBTENIR et la demande arrive au contrôleur et fonctionne bien, mais je ne veux pas qu'il travail sur la méthode GET, je veux une requête POST.
5.
Changé la RequestMapping(consomme, produit, en-têtes) pour accepter tous les types de données, mais encore 405...
Cela me rend fou! Je poste mes fichiers ci-dessous, de sorte que vous pouvez vérifier les gars, tout conseil sera appréciée. Merci! (NOTE IMPORTANTE: ceci est mon désespoir de configuration)
spring-security.xml
<beans:beans
xmlns...(all needed declarations)>
<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<!-- enable use-expressions -->
<http auto-config="true" >
<access-denied-handler error-page="/403" />
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/login" access="isAnonymous()" />
<intercept-url pattern="/403" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<form-login login-page="/login"
username-parameter="email"
password-parameter="password"
authentication-failure-url="/login?failed" />
<!--
<csrf/>
-->
</http>
..... (authentication)
AdminController.java
@Controller
@RequestMapping("/admin**")
public class AdminController {
... (all my autowired beans)
@RequestMapping(
value = "/events/loadEvents",
method = RequestMethod.POST,
consumes = MediaType.ALL_VALUE,
produces = MediaType.ALL_VALUE,
headers = "Accept=*/*")
@ResponseBody
public Event loadEvents(@RequestParam("parentId") long parentId) {
... (my logic)
return event;
}
}
Demande (capture wireshark)
Réponse (capture wireshark)
MODIFIER
ajax de jquery appeler du code
$.ajax({
type: 'POST',
cache: false,
url: /admin/events/loadEvents,
data: { parentId: 1 },
dataType = 'json',
contentType = 'application/json',
...
});
- Je atteindre cette zone de l'app seulement après avoir authentifié, c'est à dire, la première étape est de s'authentifier, puis la session d'authentification est gérée par Spring Security. Et comme je l'ai mentionné, si je change le jquery appel et contrôleur de la méthode d'action pour l'OBTENIR, il fonctionne très bien. Le problème, c'est pourquoi je me 405 POST si tout est bien configuré.
quelqu'un peut-il jeter la lumière sur les raisons qu'il a de donner 405 à la place de tout autre statut? 405 doit être indiqué lors de l'URI ne prend pas en charge la méthode HTTP à droite?
OriginalL'auteur rmpt | 2015-12-13
Vous devez vous connecter pour publier un commentaire.
Après de nombreuses heures de recherches et de tests, j'ai finalement obtenu, ant c'était un (très très) situation stupide. Donc, dans ma question je l'ai dit
Non, je n'ai pas désactivé. J'ai essayé de le désactiver faire
Mais je devrais être en train de faire:
Commentant csrf balise ne PAS désactiver csrf, c'est parce que csrf est activé par défaut! Après avoir trouver le problème est vraiment facile de dire que c'est une erreur stupide, mais comme je l'ai ajouté csrf de la balise pour l'activer, j'ai pensé que des commentaires il serait le désactiver. Trouver la réponse sur Le Printemps De La Documentation
Maintenant, de retour dans mon problème. Pour résoudre le message d'erreur 405 dans un POST appel AJAX AVEC CSRF ACTIVÉ, c'était vraiment facile. Je garde le csrf paramètres en JS variables comme ceci:
et puis mon appel ajax ressemble à ceci:
De travailler comme un charme. Hope qui aide quelqu'un à l'avenir.
OriginalL'auteur rmpt
Dans mon cas, avec le même problème, cela aide:
P. S. Merci à Illya Shulgin, cool ansver, maintenant, ici.
OriginalL'auteur Андрей