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


CSRF Token not working in Laravel 5.1 Exceptions Handler with an Ajax request

我有一个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 页面上返回任何内容?我发现这里很有趣。看起来与您的问题相似