首页 文章

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

提问于
浏览
1

我有一个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请求会收到错误:VerifyCsrfToken.php中的TokenMismatchException

我在文件中有一个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网址,它可以正常工作 .

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

编辑:

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

$request->session()->token();

1 回答

  • 0

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

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

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

相关问题