即使包含 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.你只需要在你做PATCH
,DELETE
等时包含_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 令牌不匹配异常