我遇到了CSRF异常问题,这些异常是由于完全无辜的原因引起的,例如当某人在填写表单时花费太长时间,最终提交时会话已过期并且令牌不匹配。显然这是一个错误,但它并不需要使所有东西都崩溃并抛出异常。
有没有一种方法只是让它设置一个闪存消息,然后重定向回原始页面。我不想禁用CSRF保护,我只想更优雅地处理这些错误。
有没有一种方法只是让它设置一个闪存消息,然后重定向回原始页面。我不想禁用CSRF保护,我只想更优雅地处理这些错误。
这有点麻烦,我通常会在VerifyCsrfToken类中添加一个方法来捕获TokenMismatchException(在Middleware文件夹中):
public function handle($request, Closure $next)
{
try
{
return parent::handle($request, $next);
}
catch(TokenMismatchException $e)
{
return redirect()->back()->withInput()->withErrors(['tokenMismatch' => 'Have you been away? Please try submitting the form again!']);
}
}
虽然如此,您可能需要根据应用程序中的错误处理方式进行微调。
public function render($request, Exception $e)
{
return parent::render($request, $e);
}
public function render($request, Exception $e)
{
if ($e instanceof \Illuminate\Session\TokenMismatchException){
return redirect($request->fullUrl())->with('error',"Sorry your session has expired please resubmit your request.");
}
return parent::render($request, $e);
}
namespace App\Http\Middleware;
下面加上use Closure;
,或者你可以在声明的开头加上反斜杠:public function handle($request, \Closure $next)
。 - craig_h