2016-04-28 94 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