我正在尝试使用 POST 方法对 Spring 控制器/操作进行 ajax 调用,并使用 @ResponseBody 从服务器返回一个对象。奇怪的情况是,添加 Spring Security 层后它停止工作,之前一切正常。我将尝试解释我解决问题的举措,然后向您展示代码/捕获/等。
1.
经过一番研究后,我发现一些答案表明该问题可能与 csrf 机制有关,因此我禁用了它,但问题仍然存在。 (下面是 spring-security.xml)
2.
我做了一个wireshark捕获来检查请求/响应。我的ajax请求没问题,我的控制器声明没问题,但我不明白为什么,405响应表明>允许:获取(以下截图)
3.
我尝试通过浏览器访问我的控制器操作(即发出 GET 请求),但收到错误HTTP 状态 405 - 不支持请求方法“GET”!
4.
我尝试将 RequestMapping(method...) 更改为 RequestMethod.GET 并且请求到达控制器并且工作正常,但我不希望它在 GET 方法上工作,我想要一个 POST 请求。
5.
更改了 RequestMapping(consumes, Produces, headers) 以接受所有类型的数据,但仍然是 405...
这真让我抓狂!我在下面发布了我的文件,所以你们可以检查一下,任何提示将不胜感激。谢谢! (重要提示:这是我绝望的配置)
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)
管理控制器.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;
}
}
Request (wireshark capture)
Response (wireshark capture)
EDIT
jquery ajax调用代码
$.ajax({
type: 'POST',
cache: false,
url: /admin/events/loadEvents,
data: { parentId: 1 },
dataType = 'json',
contentType = 'application/json',
...
});