2016-04-28 95 views
1

我有一个Laravel 5.1应用程序,启动时加载了Ajax内容。CSRF令牌不在Laravel 5.1异常处理程序发出Ajax请求

我已经放在CSRF meta标签页头:

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

我用它在jQuery的Ajax请求:

一切工作完全正常的情况下。但是,当我打开一个404错误页面之前没有会话,我的Ajax请求得到一个错误: TokenMismatchException在VerifyCsrfToken.php

我在文件中的404错误处理程序:程序\例外\ 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); 
} 

我可以重复这个错误,打开一个私人浏览器窗口,并打开我的网站与网址到一个不存在的页面。它持续在页面重新加载。但是,如果我去现有的网页,并再次尝试404网址,它工作正常。

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

编辑:

我试图检查多个Ajax请求,它好像每个请求有不同的令牌的complitely不同的会话:

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

回答

0

在你CSRF中间件回报父母之前添加此::处理($请求时,接下来的$):

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

编辑: 那是404页上的csrf_token()返回什么?我发现......有趣的是here。看起来类似于你的问题

+0

没有运气。 Middleware \ VerifyCsrfToken.php函数tokensMatch已经获得令牌: $ token = $ request-> input('_ token')?:$ request-> header('X-CSRF-TOKEN'); – Corrodian

+0

是的,csrf_token()返回一个值。我可以将用户重定向到一个单独的404网址,从而避免出现问题。然后,用户将失去原来的网址。似乎很奇怪,我必须这样做。 – Corrodian