即使包含 CSRF 令牌,Laravel ajax 帖子也无法正常工作

Posted

技术标签:

【中文标题】即使包含 CSRF 令牌,Laravel ajax 帖子也无法正常工作【英文标题】:Laravel ajax post not working even though CSRF token included 【发布时间】:2018-06-03 17:14:25 【问题描述】:

我很难让 ajax 帖子与 laravel v5.5.24 一起使用。这是我的 ajax 调用的样子:

var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');
$.ajaxSetup(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);
$.ajax(
    url: "/postCustomer?XDEBUG_SESSION_START=19683",
    type: 'POST',
    data: _token: CSRF_TOKEN, message:myData, "_method": 'POST',
    dataType: 'JSON',
    success: function (data) 
        console.log('call to postCustomer successful');
    
);

这是我的路线:

Route::post('/postCustomer','AdminUserController@store');

关于这个问题的有趣之处在于,当所有帖子都更改为 get 时(在 ajax 调用和路由中),请求到达并被正确处理。触发调试,一切正常。但是,路由和 ajax 调用的 iof 设置为 POST,永远不会触发调试,并且请求似乎没有成功。自然这听起来像是 CRSF 问题,但我在标头中包含了 CRSF 令牌。

【问题讨论】:

您不必在数据对象中传递_token。 CSRF 令牌通过$.ajaxSetup() 自动添加到标头中。能否发一张网络请求的截图? 您可以在表单标签中发布您的代码吗? 你检查过控制台吗? 1.您的令牌为CSRF_TOKEN,您可以在ajaxSetup() 中使用它,无需再次从元标记中查找它。 2.您将令牌发送到ajaxSetup(),无需再次发送到您的data。 3.你只需要在你做PATCHDELETE等时包含_method - 不要将它用于简单的POSTs。 4. 可能不重要,但AFAIK the dataType should be lower case - 即json。 5. 最后,实际问题是什么?您是否在 devtools 中看到请求/响应,它们看起来还可以吗? storage/logs/laravel.log呢? 检查这个:***.com/questions/53684928/… 【参考方案1】:

如果 .blade.php 文件中的 javascript 代码试试这个

 data: _token:' csrf_field() ', message:myData, "_method": 'POST',

希望有帮助

【讨论】:

您遇到了什么错误?网址正确吗?我通常在 URL 上这样做: url: " url('postCustomer') "+'?'+'XDEBUG_SESSION_START=19683',【参考方案2】:

试试这个, <meta name="_token" content="!! csrf_token() !!"/>

$.ajaxSetup(
        headers:
            'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
    );
$.ajax(
    url: "/postCustomer?XDEBUG_SESSION_START=19683",
    type: 'POST',
    data: message:myData, "_method": 'POST',
    dataType: 'JSON',
    success: function (data) 
        console.log('call to postCustomer successful');
    );

不需要再次在ajax数据中传递token。

【讨论】:

【参考方案3】:

衷心感谢所有回复的人。有几件事有助于解决这个问题。首先,我合并了 CSRF 代币提及, 并将我作为数据发送的内容仅限于此 - 如果您在 ajaxSetup 中执行此操作,则无需在数据中包含 CSRF 令牌。第二件事从我的帖子中看不到,但我遇到了涉及触发 ajax 事务的按钮的竞争条件。该按钮在 ajax 可以执行其操作之前导致页面重新加载,这就是为什么有时该操作似乎可以正常工作,但大多数情况下不会。所以 return false 是防止这种情况发生的必要条件 - 可能不是在这两个地方,但肯定是在调用 ajax 事务并且我们正在等待回调之后。可以在下面找到有效的代码。我希望它可以防止其他人花一个晚上发疯,试图找出他们的 POST 不工作的地方。要点:在 ajaxSetup 调用中处理您的 CSRF,并从整个业务中返回 false。

再次感谢大家。

-乔治·皮普金 弗吉尼亚州阿夫顿

                $.ajaxSetup(
                    headers: 
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    
                );
                $.ajax(
                    /* the route pointing to the post function */
                    url: "/postCustomer?XDEBUG_SESSION_START=19159",
                    type: 'POST',
                    /* send the csrf-token and the input to the controller */
                    data: message:myData,
                    dataType: 'json',
                    /* remind that 'data' is the response of the AjaxController */
                    success: function (data) 
                        $("#success_msg").show();
                        return false;
                    
                );
                return false;

【讨论】:

【参考方案4】:

您应该必须在数据对象中传递 _token。

data: _token:' csrf_token() ',, message:myData, "_method": 'POST',

【讨论】:

以上是关于即使包含 CSRF 令牌,Laravel ajax 帖子也无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5中多个异步ajax请求中的CSRF令牌不匹配错误?

用于 AJAX CORS 的 Laravel CSRF 令牌

本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常

Laravel csrf 令牌在 ajax 上第二次不匹配

如何使用 AJAX 请求 Laravel + Vue.js 传递 CSRF 令牌

CSRF 令牌在带有 Ajax 请求的 Laravel 5.1 异常处理程序中不起作用