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

405不允许使用方法:请求方法“POST”不支持Ajax/Spring MVC

薛修能
2023-03-14

我正在尝试使用AJAX POST将我在第三方JS函数(支付网关)的回调函数中得到的响应保存到我的服务器,但我得到的状态代码为-405方法不允许。我得到的响应是-消息:请求方法'POST'不受支持,描述:所请求的资源不允许指定的HTTP方法。

我有以下Javascript客户端代码-

gateway.pay(token, {
                    onSuccess : function(result) {
                        console.log(result);
                        saveTransactionResult(result);
                    },
                    onError : function(result) {
                        //
                    },
                    onClose : function() {
                        //
                    }
                });
.....

saveTransactionResult : function(result) { // save result to server.
    $.ajax({
        headers : {
            Accept : "text/plain",
            "Content-Type" : "application/json"
        },
        url : "/myshop/checkout/payment/complete",
        type : "POST",
        data : JSON.stringify(result),
        dataType : "text",
        success : function(data) {
            console.log(data);
            console.log("Payment Details have been saved!");
        },
        error : function() {
            console.log("an error has occurred while posting response!");
        }
    });
}

相应的服务器端Spring MVC处理程序-

@ResponseBody
@RequestMapping(value = "/complete", method = RequestMethod.POST, consumes =
{ "application/json" })
public String saveResponse(@RequestBody final ResponseData responseData)
{
    final boolean result = paymentService.savePayment(responseData);
    if (result)
    {
        return "Success";
    }
    else
    {
        return "Failure";
    }
}

关于“405方法不允许”的StackOverflow的大多数答案都导致了与跨域请求相关的问题,但我不确定这里的请求是否是跨浏览器请求,因为它是由第三方JS的回调中编写的本地代码调用的。如果情况并非如此,那么这仅仅是我的请求头或Ajax公式的问题吗?Ajax请求是否必须有一个带有注释@ResponseBody的处理程序,即使它在功能上不想返回任何特定于浏览器的内容?

{"response":"from","payment":"gateway"}&CSRFToken=7c4c40-b4c4c-44cd3-94c4-a44c437

这可能是导致问题的原因吗?如果是,我需要在我的请求处理程序中对这个CSRF令牌做任何特定的处理吗?

PS-我已经添加了ajax“头”,因为我之前得到了一个没有它们的415(不支持的媒体类型)状态代码,正如在这篇post-post JSON失败的415不支持的媒体类型,Spring3 mvc中所建议的,但现在我有了一个405!

共有1个答案

齐永昌
2023-03-14

所以问题是我的请求在org.springframework.security.web.CSRF.csrffilter中被过滤掉了,因为在服务器端的请求头或请求参数中都找不到CSRF令牌。

客户端,请求负载中的CSRFToken由通用的应用程序范围的$.ajaxPrefilter函数追加,该函数负责以与负载的内容类型相对应的不同方式将CSRFToken添加到整个应用程序中的所有POST Ajax请求中。查看这个函数,我意识到一般的经验法则是,如果数据是window.formdata类型,则在AJAX请求的“data”字段中添加CSRFToken,如果数据是“application/json”类型,则将CSRFToken添加到AJAX请求的头中,如下所示-

jqXHR.setRequestHeader('CSRFToken', ACC.config.CSRFToken);

通过显式地将Ajax参数contentType指定给application/JSON,我的ajaxPrefilter能够将CSRFToken正确地放在请求头中,而不是将它与JSON请求负载一起追加。以下请求使其工作-

saveTransactionResult : function(result) { // save result to server.
    $.ajax({
        headers : {
            Accept : "text/plain",
            "Content-Type" : "application/json"
        },
        url : "/myshop/checkout/payment/complete",
        type : "POST",
        data : JSON.stringify(result),
        dataType : "text",
        contentType : "application/json; charset=utf-8",
        success : function(data) {
            console.log(data);
            console.log("Payment Details have been saved!");
        },
        error : function() {
            console.log("an error has occurred while posting response!");
        }
    });
}
 类似资料:
  • 我得到了405请求方法'GET'在app engine的文件上传过程中不受支持,但在我的本地沙箱中相同的代码运行正常 看起来像bbloservice回调请求应该是POST类型后POST/_ah/上载/...但是当我用Firebug看的时候,它是一个带有以下头的GET请求,我确实在@Controller类中定义了请求处理程序,该类具有方法类型请求方法。POST 标题 响应Headersview源允许

  • 我正在使用ajax进行表单更新。当我在ajax中使用GET方法时,它工作得很好,但当我使用Post方法时,它抛出了错误405 method,这是不允许的。我正在本地主机上测试这个。我以前在localhost中做过,效果很好。顺便说一句,我用的是Laravel5.2。 这是我的ajax代码。 这是我在视图中使用的脚本 这是我的路线 当ajax函数和路由中的方法更改为GET时,它会打印在控制台中传递的

  • 该代码在我的本地开发环境中运行良好,但在我将其上载到服务器时,给出了一个异常。这个问题和这个问题的解决方案对我不起作用。 这是控制器。 这是routes文件中的相应条目。 这里是对URL的AJAX调用。 这就是示例测试用例的数据。 我如何克服这个错误,为什么这只发生在生产中? 值得注意的是,我在整个应用程序中还有其他对路由的AJAX调用,它们工作得很好。

  • 我有一个restcontroller和post方法,带有以下url和json请求。http://server/member/sc/v1/limited-liability/medicare 使用post方法和json请求在本地触发请求时,获得正确的响应。但在docker中以spring boot应用程序的形式运行会将异常作为不允许的方法抛出。最初,我将这个docker服务部署为put方法。现在我转

  • 在我的项目中,我面临着一个非常奇怪的问题。它与使用spring反应式webclient bulider调用rest API有关。它在本地和prod上也可以正常工作,但在向同一个endpoint发出3或4个请求后,会异常地给出以下错误。“org.springframework.web.server.MethodNotAllowedException:405方法\u不允许“请求方法'T'不受支持”这是

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