将CSRFToken添加到Ajax请求中

Ume*_*thi 32 javascript ajax jquery

我需要传递CSRFToken基于Ajax的帖子请求,但不确定如何以最佳方式完成此操作.使用内部检查CSRFToken请求的平台(仅限POST请求)

最初我想把它添加到标题中

$(function() {
    $.ajaxSetup({
        headers : {
            'CSRFToken' : getCSRFTokenValue()
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

这将使它可用于每个Ajax请求,但它不适用于我的情况,因为在请求CSRFToken中仍然为null.

有什么方法可以设置CSRFToken所有Ajax调用处理POST类型

编辑 如果我在Ajax调用中执行类似的操作

data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},
Run Code Online (Sandbox Code Playgroud)

一切都很好.

我的问题是,我想将CSRFToken值作为请求参数传递而不是作为请求标头传递

Kri*_*h R 29

这个怎么样,

$("body").bind("ajaxSend", function(elm, xhr, s){
   if (s.type == "POST") {
      xhr.setRequestHeader('X-CSRF-Token', getCSRFTokenValue());
   }
});
Run Code Online (Sandbox Code Playgroud)

参考:http://erlend.oftedal.no/blog/? blogid = 118

CSRF作为参数传递,

        $.ajax({
            type: "POST",
            url: "file",
            data: { CSRF: getCSRFTokenValue()}
        })
        .done(function( msg ) {
            alert( "Data: " + msg );
        });
Run Code Online (Sandbox Code Playgroud)


Che*_*mer 8

这是我在使用 ajax 发送 POST 请求时用来防止 CSRF 令牌问题的代码

$(document).ready(function(){
    function getCookie(c_name) {
        if(document.cookie.length > 0) {
            c_start = document.cookie.indexOf(c_name + "=");
            if(c_start != -1) {
                c_start = c_start + c_name.length + 1;
                c_end = document.cookie.indexOf(";", c_start);
                if(c_end == -1) c_end = document.cookie.length;
                return unescape(document.cookie.substring(c_start,c_end));
            }
        }
        return "";
    }

    $(function () {
        $.ajaxSetup({
            headers: {
                "X-CSRFToken": getCookie("csrftoken")
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)

});


Far*_*lko 7

你可以用这个:

var token = "SOME_TOKEN";

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  jqXHR.setRequestHeader('X-CSRF-Token', token);
});
Run Code Online (Sandbox Code Playgroud)

来自文档:

jQuery.ajaxPrefilter([dataTypes],handler(options,originalOptions,jqXHR))

描述:在发送每个请求之前以及$ .ajax()处理它们之前,处理自定义Ajax选项或修改现有选项.


小智 5

如果您使用 lusca 在 node.js 中工作,也可以尝试以下操作:

$.ajax({
url: "http://test.com",
type:"post"
headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')}
})
Run Code Online (Sandbox Code Playgroud)


MOn*_*key 5

从 JSP

<form method="post" id="myForm" action="someURL">
    <input name="csrfToken" value="5965f0d244b7d32b334eff840...etc" type="hidden">    
</form>
Run Code Online (Sandbox Code Playgroud)

这是在挣扎了 3 小时后对我有用的最简单的方法,只需像这样从输入隐藏字段中获取令牌,并且在执行 AJAX 请求时只需要在标头中传递此令牌,如下所示:-

来自 jQuery

var token =  $('input[name="csrfToken"]').attr('value'); 
Run Code Online (Sandbox Code Playgroud)

来自普通的 Javascript

var token = document.getElementsByName("csrfToken").value;
Run Code Online (Sandbox Code Playgroud)

最终的 AJAX 请求

$.ajax({
      url: route.url,
      data : JSON.stringify(data),
      method : 'POST',
      headers: {
                    'X-CSRF-Token': token 
               },
      success: function (data) { ...      },
      error: function (data) { ...  }
Run Code Online (Sandbox Code Playgroud)

});

现在你不需要在 web 配置中禁用 crsf 安全性,而且这不会在控制台上给你 405(Method Not Allowed) 错误。

希望这会帮助人们.. !!