CSRF令牌无法在带有Ajax请求的Laravel 5.1 Exceptions Handler中工作

时间:2016-04-28 11:07:41

标签: php jquery ajax laravel laravel-5.1

我有一个Laravel 5.1应用程序,启动时加载了Ajax内容。

我已将CSRF元标记放在页面头部:

User

我在jquery ajax请求中使用它:

<meta name="csrf-token" content="{{ csrf_token() }}" />

在正常情况下,一切都很完美。但是当我在没有前一个会话的情况下打开404错误页面时,我的ajax请求会出错: VerifyCsrfToken.php中的TokenMismatchException

我在文件中有一个404错误处理程序:app \ Exceptions \ Handler.php

$.ajaxSetup(
{
  headers:
  {
    "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content")
  }
});

我可以通过打开私人浏览器窗口并使用网址打开我的网站来重复此错误。它会在页面重新加载时持续存在。但是,如果我转到现有页面并再次尝试404网址,则可以正常使用。

任何想法如何解决这个问题?

编辑:

我尝试检查多个ajax请求,似乎每个请求都有一个完全不同的会话和不同的令牌:

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);
}

1 个答案:

答案 0 :(得分:0)

在您的CSRF中间件中,在返回parent :: handle($ request,$ next)之前添加:

if($request->ajax())
{
    \Input::merge([
        '_token' => $request->header('X-CSRF-Token')
    ]);
}

编辑: csrf_token()是否在404页面上返回任何内容?我发现有趣here。看起来与您的问题类似