java - Spring Security CSRF token 不适用于 AJAX

标签 java ajax spring spring-mvc csrf

我的 spring boot 应用程序中存在 csrf token 问题。

我有一个可以编辑人物的表单。一个人可以拥有

现在让我们想象这个人有一辆车,然后输入并存储它。下次他要删除这辆车并输入另一辆车。我已经创建了它,以便有一个包含他所有汽车的列表——他可以选择将其从列表中删除。现在我从这些药丸开始,想用相应的 ID 向服务器发送一个 POST。当我尝试时,我得到了 403 禁止,我不知道为什么。

如果我从 POST 更改为 GET,那么它就可以工作。

我的 JavaScript(取自本站:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag)

var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");

// using JQuery to send a non-x-www-form-urlencoded request
var headers = {};
headers[csrfHeader] = csrfToken;
$.ajax({
    url: "./delete/car",
    type: "GET",
    headers: headers,
});

$.ajax({
     url: "./delete/car",
     type: "POST",
     headers: headers,
});

我的 Controller 方法:

@RequestMapping(value = "/{login}/delete/car", method = RequestMethod.GET)
    public ModelAndView delete(@PathVariable("login") final String login) {
        System.out.println("Stop");
        return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW);
    }

    @RequestMapping(value = "/{login}/delete/car", method = RequestMethod.POST)
    public ModelAndView deleteInstEmp(@PathVariable("login") final String login) {
        System.out.println("Stop");
        return new ModelAndView("redirect:" + WebSecurityConfig.URL_PERSONS_OVERVIEW);
    }

有什么建议吗?

提前致谢。

最佳答案

好的,经过所有这些努力之后,我得到了以下结果。

我添加了 fail方法到 Ajax 构造并获得以下消息:

"Failed to execute 'setRequestHeader' on 'XMLHttpRequest': '${_csrf.headerName}' is not a valid HTTP header field name."

官方 spring 站点建议您必须输入:<sec:csrfMetaTags />或者从其他来源,这个:<meta name="_csrf" th:content="${_csrf.token}"/>在您的 html 文件中。

在此之后,您应该能够在 JavaScript 中访问这些属性,但在我的例子中,我得到了 undefined${_csrf.headerName} .

最后一次尝试是从隐藏值中获取值(第 24.5 章:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#the-csrfmetatags-tag)。

现在,我有以下内容:

$(function () {
    var token = $("input[name='_csrf']").val();
    var header = "X-CSRF-TOKEN";
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });
});

$.ajax({
    url: "./delete/car",
    type: "POST",
    success:function(response) {
        alert(response);
    }
});

有了这个,它就像一个魅力。

关于java - Spring Security CSRF token 不适用于 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27834867/

相关文章:

java - 可完成的 future | thenApply 与 thenCompose

php - 使用ajax使用已从数据库检索的数据获取更多mysql数据

java - Spring data Elasticsearch 按字段查找和最新日期查询

java - 如何使用spring从sftp服务器获取zip文件

php - rename() 和 unlink() 是异步函数吗?

java - 在tomcat中部署Spring boot应用程序

java - HBase [错误] : org. apache.hadoop.hbase.client.AsyncProcess - 无法获取副本 0 位置

java - for 星形图案循环

java - 我们可以在java中从USB闪存驱动器获取VID和PID吗?

php - WordPress 中的 AJAX 搜索