【问题标题】:Catch TokenMismatchException [duplicate]捕获 TokenMismatchException [重复]
【发布时间】:2017-04-30 23:53:42
【问题描述】:

有时,当laravel_session cookie 过期而我仍在页面上时,我会登录并收到TokenMismatchException 错误。这是可以理解的。

我想处理这种情况,例如通过向用户显示某种错误并重定向。如果可能的话,我想只为登录请求捕获它。

主要问题是 CSRF 令牌由全局中间件检查,因此在我可以在控制器操作中使用 try-catch 块处理它之前引发错误。

另一个问题是app/Http/Middeware目录下的VerifyCsrfToken.php,长这样:

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

我看不出如何使用上面的代码来捕获TokenMismatchException。好像我只能排除特定的 URI。

有什么办法可以做到吗?

【问题讨论】:

  • 您真的有用户闲置了 N 小时然后想要使用该应用程序吗?然后延长会话时间。
  • 如果您发现了 TokenMismatchException,您将自己置于安全风险之中。这没有任何意义。
  • 我最好只为登录请求捕获异常,而不是全局捕获异常。此外,延长会话时间对我来说不是解决方案。会话设置为 2 小时,仍有用户存在此问题。
  • 然后制作一个中间件,在令牌不匹配发生之前将具有无效会话的用户重定向到登录页面。在登录之前,没有创建会话,因此不会有任何错误。

标签: php laravel


【解决方案1】:

转到 app\Exceptions\Handler.php 并像这样测试它:

//Add this to render() method:

if ($exception instanceof TokenMismatchException) {
   return $this->handleTokenMismatchException($exception);
}

// then...

protected function handleTokenMismatchException(TokenMismatchException $exception) {

    // What you gonna do about it e.g. return redirect('/somewhere');

}

【讨论】:

  • 如前所述,这显然是我这边的副本,但答案是有效的。谢谢!
猜你喜欢
  • 2017-10-07
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2020-12-16
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多