我有一个Laravel 5.1应用程序,在启动时加载了Ajax内容。
我已将 CSRF 元标记放在页面标题:
<meta name="csrf-token" content="{{ csrf_token() }}" />
我在jquery ajax请求中使用它:
$.ajaxSetup(
{
headers:
{
"X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content")
}
});
在正常情况下,一切都很完美。但是当我在没有上一个会话的情况下打开 404 错误页面时,我的 ajax 请求收到错误:TokenMismatchException in VerifyCsrfToken.php
我在文件中有一个 404 错误处理程序:app''Exceptions''Handler.php
public function render($request, Exception $e)
{
if ($e instanceof NotFoundHttpException)
{
$foo = 'App'Foo::foo();
return 'Response::make(view("errors.404", compact("foo")), 404);
}
return parent::render($request, $e);
}
我可以通过打开私人浏览器窗口并使用指向不存在页面的 url 打开我的网站来重复此错误。它在页面重新加载时仍然存在。但是,如果我转到现有页面并再次尝试 404 url,它工作正常。
任何想法如何解决这个问题?
编辑:
我尝试检查多个 ajax 请求,似乎每个请求都有一个具有不同令牌的完全不同的会话:
$request->session()->token();
在你的 CSRF 中间件中添加这个 在返回 parent::handle($request, $next):
if($request->ajax())
{
'Input::merge([
'_token' => $request->header('X-CSRF-Token')
]);
}
编辑:csrf_token() 是否在该 404 页面上返回任何内容?我发现这里很有趣。看起来与您的问题相似