当前位置: 首页 > 知识库问答 >
问题:

Ajax POST结果为405(方法不允许)-Spring MVC

鞠侯林
2023-03-14

我正在尝试用POST方法对我的Spring控制器/Action进行ajax调用,并用@ResponseBody从服务器返回一个对象。奇怪的是,在添加了Spring Security层之后,它就停止工作了,之前一切都正常工作。我将试着解释我的解决问题的方法,然后向您展示代码/捕获/等等。

1.经过一些研究,我找到了一些答案,说明这个问题可能与csrf机制有关,所以我禁用了它,仍然存在这个问题。(spring-security.xml)

2.我做了一个wireshark捕获来检查请求/响应。我的ajax请求是OK,我的控制器声明是OK,但是我不明白为什么,405响应指示>ALLOW:GET(capture bellow)

3.我尝试通过浏览器访问我的控制器操作(即,发出一个GET请求),我得到错误HTTP状态405-请求方法'GET'不受支持!

4.我尝试更改RequestMapping(方法...)对于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)  
@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',

    ...
});

共有1个答案

漆雕育
2023-03-14

经过许多小时的研究和测试,我终于得到了它,蚂蚁这是一个(非常非常)愚蠢的情况。所以,在我的问题中我说

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

不,我没有禁用它。我想让它停用

<!--
<csrf/>
-->
<csrf disabled="true"/>
<script type="text/javascript">
    var csrfParameter = '${_csrf.parameterName}';
    var csrfToken = '${_csrf.token}';
</script>
var jsonParams = {};
jsonParams['parentId'] = 1;
jsonParams[csrfParameter] = csrfToken;
$.ajax({
    type: 'POST',
    cache: false,
    url: /admin/events/loadEvents,
    data: jsonParams,
    dataType = 'json',
    contentType = 'application/json',

    ...
});

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

 类似资料:
  • 我有一个非常简单的Spring引导应用程序,它由以下代码保护: 这个想法是为了保护“admin”部分。它公开了一个RESTAPI。问题是所有的帖子都被退回了 405方法不允许 如果我从应用程序中删除安全启动器,它就会工作。这让我相信安全配置是问题所在。但我不知道怎么做。

  • 问题内容: 我正在开发flask注册表格,但收到错误消息: 码: registration.html: 当我访问时,我收到错误消息。我究竟做错了什么? 问题答案: 这是因为在定义路由时仅允许POST请求。 当你在浏览器中访问时,它将首先执行GET请求。只有提交表单后,浏览器才会执行POST。因此,对于像你这样的自我提交表单,你需要同时处理两者。 使用 应该管用。

  • 问题内容: 我打算使用Ajax将跨域请求发送到soap Web服务。Web服务的URL是:http://example1.asmx?op = GetVOD 我的代码: 在IIS 7服务器端,我已经将这些行添加到文件web.config中 当我在Chrome上运行客户端代码时,出现405错误: 有谁知道如何解决这个问题? 预先感谢 问题答案: 听起来像Web DAV正在阻碍。这是删除它的配置: ht

  • 我正在尝试使用angularJs和$http发布一个表单。post方法。但每当我执行此函数时,它都会给我以下错误:加载资源失败:服务器响应状态为405(不允许使用方法),我不知道该怎么办。(Im使用visual studio 2015)

  • 我有一个jquery脚本(从github下载),可以删除实体。下面是脚本。 }); 而我就是这样利用它的 相应的laravel路线如下所示 然而,当我尝试按下X(删除按钮)时,我得到了405方法不允许的错误。错误如下 这在我的本地沙箱上运行良好。 任何帮助都将不胜感激。 谢啦

  • 我试图用jQuery做一个POST请求,但是我得到了一个错误405(不允许使用方法),我正在使用Laravel 5 这是我的代码: jQuery 超文本标记语言 控制器 JQuery错误http://localhost/laravel5.1/public/empresas/eliminar/5405(不允许方法)。 url值为 数据值是 如果我更改为request它工作正常,但我想做一个post请