1.
经过一些研究后,我发现了一些答案,说明问题可能与csrf机制有关,所以我禁用它并仍然存在问题. (spring-security.xml bellow)
2.
我做了一个wireshark捕获来检查请求/响应.我的ajax请求没问题,我的控制器声明没问题,但我不明白为什么,405响应表明>允许:GET(捕获波纹管)
3.
我试图通过浏览器访问我的控制器操作(即发出GET请求),我收到错误HTTP状态405 – 不支持请求方法’GET’!
4.
我试图将RequestMapping(方法…)更改为RequestMethod.GET,并且请求到达控制器并且工作正常,但我不希望它在GET方法上工作,我想要一个POST请求.
5.
更改了RequestMapping(使用,生成,标题)以接受所有类型的数据,但仍然是405 …
这真让我抓狂!我发布我的文件,所以你可以检查它们,任何提示将不胜感激.谢谢! (重要说明:这是我的绝望配置)
<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; } }
$.ajax({ type: 'POST',cache: false,url: /admin/events/loadEvents,data: { parentId: 1 },dataType = 'json',contentType = 'application/json',... });
解决方法
so I disabled it (csrf on spring-security.xml) and still have the issue.
不,我没有禁用它.我试图禁用它
<!-- <csrf/> -->
但我应该这样做:
<csrf disabled="true"/>
注释csrf标签不会禁用csrf,这是因为默认情况下启用了csrf!找到问题后很容易说这是一个愚蠢的错误,但是当我添加csrf标签来启用它时,我认为评论它会禁用它.在Spring Documentation找到答案
现在,回到我的问题.要使用CSRF ENABLED在POST AJAX调用中修复405错误消息,这非常简单.我将csrf参数保存在JS变量中,如下所示:
<script type="text/javascript"> var csrfParameter = '${_csrf.parameterName}'; var csrftoken = '${_csrf.token}'; </script>
然后我的ajax调用看起来像这样:
var jsonParams = {}; jsonParams['parentId'] = 1; jsonParams[csrfParameter] = csrftoken; $.ajax({ type: 'POST',data: jsonParams,... });
像魅力一样工作.希望将来帮助某人.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。