加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 02:54:04 所属栏目:百科 来源:网络整理
导读:我正在尝试用POST方法对我的 Spring控制器/动作进行ajax调用,并使用@ResponseBody从服务器返回一个对象.奇怪的情况是它在添加spring安全层后停止工作,之前一切正常.我将尝试解释我解决问题的步骤,然后向您展示代码/捕获/等. 1. 经过一些研究后,我发现了一些
我正在尝试用POST方法对我的 Spring控制器/动作进行ajax调用,并使用@ResponseBody从服务器返回一个对象.奇怪的情况是它在添加spring安全层后停止工作,之前一切正常.我将尝试解释我解决问题的步骤,然后向您展示代码/捕获/等.

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 …

这真让我抓狂!我发布我的文件,所以你可以检查它们,任何提示将不胜感激.谢谢! (重要说明:这是我的绝望配置)

弹簧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;
    }
}

请求(wireshark捕获)

HTTP Request (link smudged because I've used a simplified on my question)

响应(wireshark捕获)

enter image description here

编辑
jquery ajax调用代码

$.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,...
});

像魅力一样工作.希望将来帮助某人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读