我想在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()
返回状态代码时,它不会返回任何值。因此我不知道如何处理这个异常。
任何合理的建议将不胜感激。
答案 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保护适用于登录用户和访客。因此,重定向到登录页面并不能解决这个问题。