【问题标题】:How to handle TokenMismatchException如何处理 TokenMismatchException
【发布时间】:2017-03-24 13:29:48
【问题描述】:

我想处理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() 返回状态码时,它没有返回任何值。因此我不知道如何处理这个异常。

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

【问题讨论】:

    标签: laravel laravel-5.2


    【解决方案1】:

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

    /**
     * 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 保护适用于登录用户和访客。所以,重定向到登录页面并不能真正解决这个问题。

    【讨论】:

    • dontReport 数组中没有 TokenMismatchException。那我该怎么解决呢?
    猜你喜欢
    • 2019-10-17
    • 2016-05-23
    • 2018-11-21
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2016-10-03
    相关资源
    最近更新 更多