Ajax POST 导致 405(方法不允许) - Spring MVC

2023-12-07

我正在尝试使用 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) HTTP Request (link smudged because I've used a simplified on my question)

Response (wireshark capture) enter image description here

EDIT jquery ajax调用代码

$.ajax({
    type: 'POST',
    cache: false,
    url: /admin/events/loadEvents,
    data: { parentId: 1 },
    dataType = 'json',
    contentType = 'application/json',

    ...
});

经过几个小时的研究和测试,我终于明白了,这是一个(非常非常)愚蠢的情况。所以,在我的问题中我说

所以我禁用了它(spring-security.xml 上的 csrf),但仍然存在问题。

不,我没有禁用它。我试图禁用它

<!--
<csrf/>
-->

但我应该这样做:

<csrf disabled="true"/>

评论 csrf 标签确实NOT禁用csrf,这是因为csrf默认是启用的!发现问题后很容易说这是一个愚蠢的错误,但当我添加 csrf 标签来启用它时,我认为评论它会禁用它。找到答案Spring文档

现在,回到我的问题。修复 405 错误消息启用 CSRF 的 POST AJAX 调用,这真的很容易。我将 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',
    cache: false,
    url: /admin/events/loadEvents,
    data: jsonParams,
    dataType = 'json',
    contentType = 'application/json',

    ...
});

像魅力一样工作。希望对将来的人有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ajax POST 导致 405(方法不允许) - Spring MVC 的相关文章

随机推荐