📜  Laravel 捕获 TokenMismatchException - PHP (1)

📅  最后修改于: 2023-12-03 15:02:37.112000             🧑  作者: Mango

Laravel 捕获 TokenMismatchException - PHP

在使用Laravel框架开发Web应用程序时,您可能会遇到以下错误:

TokenMismatchException in VerifyCsrfToken.php line 67:

该错误表示,在请求中提交的一个表单中包含一个 CSRF 令牌,但该令牌未能与服务器上维护的令牌匹配。这种情况通常发生在表单过期,用户在提交表单时逗留太久,或者Web浏览器中的Cookie被删除时。

Laravel提供了一种近似于全局的处理方法,它不仅可以捕获此类异常,而且还可以对所有未捕获的异常进行处理。我们可以在应用程序的 app/Exceptions/Handler.php 文件中进行设置:

<?php
 
namespace App\Exceptions;
 
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Session\TokenMismatchException;
 
class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
        // CSRF Token 失败
        if ($exception instanceof TokenMismatchException) {
            return redirect()
                ->back()
                ->withInput($request->except('_token'))
                ->withErrors(['token' => 'Token Mismatch Exception']);
        }
 
        return parent::render($request, $exception);
    }
}

该代码片段在render()方法中捕获TokenMismatchException异常。如果异常被捕获,则将用户重定向回之前提交的表单,并包含表单中的所有输入(除了CSRF令牌),以便用户可以重新提交表单。此外,它还在表单顶部显示了一个错误,指出发生了Token Mismatch。

在处理过异常后使用parent::render()方法使应用程序继续正常运行,以便其他异常可以正常处理。

通过这种方法处理除令牌失配异常以外的所有异常,在一定程度上增强了应用程序的健壮性,并提高了用户体验,同时也加强了应用程序的安全性。

以上是关于如何捕获Laravel中TokenMismatchException异常的介绍。希望您可以根据此文建立一个更加健壮和安全的应用程序。