Spring Security CSRF令牌不在同一个JSP中使用AJAX调用和表单提交

 拍友2502908871 发布于 2022-12-09 12:56

我试图通过下面的链接在我的项目中实现spring security(ver 3.2.3)CSRF令牌

http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#csrf http://docs.spring.io/autorepo/docs/spring-security/ 4.0.0.CI-SNAPSHOT /参考/ htmlsingle /#的-csrfmetatags标签

我能够在没有AJAX调用的情况下成功地在JSP中集成CSRF令牌.但是,当我尝试使用AJAX调用JSP时,获得"无效的CSRF令牌异常".在我的分析之后,我找到了使用相同令牌的AJAX调用和表单提交,因为我得到了"无效的CSRF令牌异常".

可以请任何人帮我突袭这个问题.有没有办法生成两个令牌,即一个用于AJAX调用,一个用于表单提交

security.xml文件

    

    

    

    

    

        

    

    


 

JSP







added below < input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> statement in form tag 

感谢和问候,西瓦

2 个回答
  • 要在启用CSRF的情况下发出AJAX/JSON请求,您必须将CSRF令牌作为HTTP请求标头传递,而不是参数或其他数据.

    在页面上,您的元标记应如下所示:

    <meta name="_csrf" content="${_csrf.token}"/>
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    

    然后,在JS代码中的某处准备值:

    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    

    将CSRF令牌作为标头传递:

    $.ajax({
            type: "GET",
            async: false,
            url: './getMerchantByInstitution.htm',
            data: "institutionId=" + option,
            beforeSend: function(xhr) {
                // here it is
                xhr.setRequestHeader(header, token);
            },
            success: function(obj) {
                //  ....
            },
            ....
    

    虽然这完全取决于你,但我建议使用像JSON.stringify这样的东西来传递数据,但这当然取决于它.

    参考文献如下:

    http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html#csrf-include-csrf-token-ajax

    希望这可以帮助.

    2022-12-11 02:12 回答
  • 我希望以下答案有所帮助.进行这些更改

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

    之后

    data[csrfParameter] = csrfToken;
    data["institutionId"] = option;
    headers[csrfHeader] = csrfToken;    // THIS WAS ADDED
    

    最后改变了ajax调用:

    url: './getMerchantByInstitution.htm',
    headers: headers,    // THIS WAS ADDED
    data: data,//"institutionId=" + option,
    dataType:'json',
    

    让我知道这个是否奏效.

    2022-12-11 02:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有