如何处理TokenMismatchException

时间:2017-03-24 13:29:49

标签: laravel laravel-5.2

我想在VerifyCsrfToken.php第67行例外处理 TokenMismatchException,然后将用户重定向到登录页面。

当用户登录并清除浏览器数据(会话,历史记录等)或用户会话过期时,会发生错误。

我已经在 Handler.php 中尝试了以下解决方案:

if ($e instanceof TokenMismatchException) {
    return redirect()->route('welcome');
}

完整的Haler.php代码:

class Handler extends ExceptionHandler {

    protected $dontReport = [
        AuthorizationException::class,
        HttpException::class,
        ModelNotFoundException::class,
        ValidationException::class,
    ];

    public function report(Exception $e)
    {
        parent::report($e);
    }

    public function render($request, Exception $e)
    {

      if ($e instanceof TokenMismatchException) {
        return redirect()->route('welcome');
      }

      return parent::render($request, $e);

    }
}

我还尝试返回状态代码,然后尝试处理它,但是当我通过$e->getStatusCode()返回状态代码时,它不会返回任何值。因此我不知道如何处理这个异常。

任何合理的建议将不胜感激。

1 个答案:

答案 0 :(得分:-1)

如果您要处理TokenMismatchException中的app/Exceptions/Handler,则需要将其从$dontReport类中的Handler数组中删除

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
    \Illuminate\Auth\AuthenticationException::class,
    \Illuminate\Auth\Access\AuthorizationException::class,
    \Symfony\Component\HttpKernel\Exception\HttpException::class,
    \Illuminate\Database\Eloquent\ModelNotFoundException::class,
    // \Illuminate\Session\TokenMismatchException::class, --> delete this line
    \Illuminate\Validation\ValidationException::class,
];

虽然,我会警告你,将用户重定向到此例外的登录页面并不是解决此问题的正确方法。

csrf token不匹配时,会引发TokenMismatchException。 CSRF保护适用于登录用户和访客。因此,重定向到登录页面并不能解决这个问题。