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