Spring MVC预授权Controller操作没有获得POST请求

时间:2015-06-24 09:02:05

标签: jquery ajax spring-mvc http-status-code-405

Spring MVC和Ajax的一个菜鸟。我正在尝试使用jQuery Ajax帖子将一些数据从视图发送到控制器,但它要么给我405 handleHttpRequestMethodNotSupported或403 :-(有人可以指出我正确的方向吗?

这是我的控制器操作preAuthorize

@PreAuthorize( "hasAuthority('Admin')" )
@RequestMapping( value = "/configSave", method = RequestMethod.POST )
public String saveConfiguration( @RequestParam String test )
{
    return "configSave";
}

以下是发送帖子请求的页面中的代码。

...
<input type="button" value="Save" id="save" onclick="saveConfig()"/>
...
function saveConfig()
    {
        var testPost = { test: "testing"};

        $.ajax(
                {
                    url: "hello/configSave",
                    data: "{'test':'testing'}",
                    contentType: "application/x-www-form-urlencoded",
                    type: "post",
                    beforeSend: function (xhr) {
                        xhr.setRequestHeader("Accept", "application/json");
                        xhr.setRequestHeader("Content-Type", "application/json");
                    },
                    success: function () {
                        alert("foo");
                    },
                    error: function() {
                        alert("bar");
                    }
                }
        );
    }

它所做的一切就是在bar警告时抛出403(现在,否则为405)错误。

修改 令人惊讶的是,当我不做ajax post(我需要做)时,它调用控制器中的configSave动作。真的对这种行为感到困惑!

2 个答案:

答案 0 :(得分:1)

管理以查找Spring文档thisthis中的几个部分,其中说明在使用Spring Security时我需要使用CSRF令牌发送帖子请求。经过大量的测试和跟踪后,我发现以下代码适合我。我希望它也有助于其他人。欢迎任何更好的建议。

...<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>...

...<sec:csrfMetaTags />...//Within <head>

...var csrfToken = $("meta[name='_csrf']").attr("content");...//somewhere in page load

function saveConfig()
    {
        var test = { name: "testing" };

        $.ajax(
                {
                    url: "hello/configSave",
                    data: JSON.stringify( test ),
                    dataType: "text",
                    contentType: "application/json",
                    type: "post",
                    headers: {
                        'Accept': 'application/json',
                        'Content-Type': 'application/json',
                        'X-CSRF-TOKEN': csrfToken //adding this made it WORK!
                    },
                    success: function (msg) {
                        alert("Yippie! Saved");
                    },
                    error: function() {
                        alert("Save failed, please try again!");
                    }
                }
        );
    }

答案 1 :(得分:0)

添加headers = "Accept=application/json"

contentType: "application/x-www-form-urlencoded",替换为contentType : "application/json",

这里有许多活动部件。为什么不拆分它并在较小的部分进行验证。在Spring authentication之外创建类似的代码。在Ajax工作后,您可以添加Spring authentication403405无关。因为,这只是标题不匹配,其他是安全问题。