带有 Spring Security CSRF 令牌的 jQuery 文件下载插件问题

Posted

技术标签:

【中文标题】带有 Spring Security CSRF 令牌的 jQuery 文件下载插件问题【英文标题】:jQuery File Download plugin issue with Spring Security CSRF token 【发布时间】:2017-08-03 16:30:42 【问题描述】:

我正在使用 jQuery 文件下载插件,而对于后端,我正在使用带有 Spring Security 的 Spring,当我尝试将请求发送回浏览器以下载文件时,我收到 403 错误:

HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”。

我正在尝试将此参数作为请求标头传递,这怎么可能进入这个插件?

例如,在一个简单的 AJAX 请求中,我通过以下方式完成了此操作:

var header = $("meta[name='_csrf_header']").attr("content");
var token = $("meta[name='_csrf']").attr("content");
$.ajax(dataType : 'json',
        url : serverURL,
        data : filesData,
        type : fetchMethod,
        enctype: 'multipart/form-data',
        processData: false,
        contentType:false,
        beforeSend: function(xhr)
            xhr.setRequestHeader(header, token);

        
)

而且效果很好!

【问题讨论】:

【参考方案1】:

你可以传递'_csrf'参数如下

$.fileDownload(url, 
    data: 
        '_csrf': <CSRF-TOKEN>
    ,
    successCallback: function (html,data) 
     ,
     failCallback: function (form,data) 
     
); 

【讨论】:

以上是关于带有 Spring Security CSRF 令牌的 jQuery 文件下载插件问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 enctype="multipart/form-data" 的 Spring Security CSRF [重复]

如何将 Spring Security 的 CSRF 功能用于无状态端点?

使用 CSRF 登录后如何启用 Spring Security POST 重定向?

Gatling 测试 CSRF Spring Security 通过 Web 表单阻止了我的帖子

使用 Spring Security 3.2.0.RELEASE,如何在没有标签库的纯 HTML 页面中获取 CSRF 令牌

Spring Boot、Spring Security 和 Thymeleaf:将 CsrfFilter 应用到带有表单的网站