2017-05-09 88 views
1

我想陷阱TokenMismatchException在Laravel的Handler.phpLaravel異常處理程序沒有捕捉TokenMismatchException

當我通過暫時去除形式令牌模仿CSRF令牌例外,我的網站的本地開發版本顯示我:

TokenMismatchException in VerifyCsrfToken.php line 68: 

但是,當我改變Handler.php中的render()函數來尋找異常並處理錯誤,那麼它不起作用。例如,如果我將下面的默認代碼替換爲測試代碼,並從表單中取出csrf標記,則系統會返回「這不是標記問題」消息,而不是「標記問題」消息。

public function render($request, Exception $exception) 
{ 
    if($exception instanceof TokenMismatchException) { 
     return('token problem'); 
    }else{ 
     return('this was not a token problem'); 
    } 
    return parent::render($request, $exception); 
} 

所以,用默認代碼Laravel似乎認識到了TokenMismatchException,但我上面的簡單測試代碼,它沒有。你能向我解釋發生了什麼事嗎?

+0

每一個評論者:[DisgruntledGoat](HTTP ://stackoverflow.com/users/37947/disgruntledgoat)[這個答案](http://stackoverflow.com/a/29116516/1575353),你有'使用Illuminate \ Session \ TokenMismatchException;'類定義之前? –

+0

我在我的搜索過程中看到DisgruntledGoat的答案,並且實現它無濟於事,所以它不在當前代碼中。現在,通過重新包含使用聲明並通過實施Ian建議的http響應,我最終可以捕獲異常並重定向到另一個頁面,告訴用戶再次嘗試,或者我決定做的任何事情。這是我使用Laravel創建的第一個網站 - 它是來自CodeIgniter的學習曲線! – Wittner

回答

0

它就有可能是崩潰,因爲返回期待一個\Illuminate\Http\Responserender()

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $exception 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $exception) 
{ 

    if($exception instanceof TokenMismatchException) 
     return response()->json('Token mismatch'); 

    return parent::render($request, $exception); 
} 

請記住,使用正確的類的異常

use Illuminate\Session\TokenMismatchException;

+0

謝謝伊恩。只是消化... – Wittner

+0

基本上你正在返回一個字符串,而它期待一個對象被返回。 – Ian

+0

我現在明白,響應需要是一個正確的http響應,並且你已經創建了一個帶json格式字符串的http響應。我正在嘗試,仍然是'不是不符合標記'。我已經在我的問題 – Wittner