小编典典

jQuery将CSRF令牌添加到所有$ .post()请求的数据中

ajax

我正在使用Laravel 5应用程序,该应用程序默认为所有POST请求启用CSRF保护。我喜欢这种增加的安全性,因此我正在尝试使用它。

发出简单$.post()请求时,我收到一个'Illuminate\Session\TokenMismatchException'错误,因为_tokenPOST数据中缺少所需的表单输入。这是一个有关$
.post请求的示例:

var userID = $("#userID").val();
$.post('/admin/users/delete-user', {id:userID}, function() {
// User deleted
});

我将CSRF令牌存储为标头中的meta字段,可以使用以下命令轻松访问它:

var csrf_token = $('meta[name="csrf-token"]').attr('content');

是否可以在所有传出$.post()请求中将其附加到json数据?我尝试使用标头,但Laravel似乎无法识别它们-

var csrf_token = $('meta[name="csrf-token"]').attr('content');
alert(csrf_token);
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
    if (options['type'].toLowerCase() === "post") {
        jqXHR.setRequestHeader('X-CSRFToken', csrf_token);
    }
});

阅读 334

收藏
2020-07-26

共1个答案

小编典典

您的$.ajaxPrefilter方法是一种很好的方法。但是,您不需要添加标题。您只需要在data字符串中添加一个属性。

数据作为的第二个参数提供$.post,然后id=foo&bar=baz&...在预过滤器访问data选项之前格式化为查询字符串()。因此,您需要在查询字符串中添加自己的字段:

var csrf_token = $('meta[name="csrf-token"]').attr('content');
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
    if (options.type.toLowerCase() === "post") {
        // initialize `data` to empty string if it does not exist
        options.data = options.data || "";

        // add leading ampersand if `data` is non-empty
        options.data += options.data?"&":"";

        // add _token entry
        options.data += "_token=" + encodeURIComponent(csrf_token);
    }
});

这将id=userID变成id=userID&_token=csrf_token

2020-07-26