【发布时间】:2016-01-12 07:08:07
【问题描述】:
我遇到了向用户抛出 CSRF 异常的问题。它们的发生是出于完全无辜的原因,例如,如果有人在最终提交表单时填写表单的时间过长,则会话已过期并且令牌不匹配。现在显然这是一个错误,但它不需要杀死所有东西并抛出异常。
有没有办法让它设置一个 Flash 消息,然后重定向回原始页面。我不想禁用 CSRF 保护我只想更优雅地处理错误。
【问题讨论】:
标签: php laravel laravel-5 laravel-5.1
我遇到了向用户抛出 CSRF 异常的问题。它们的发生是出于完全无辜的原因,例如,如果有人在最终提交表单时填写表单的时间过长,则会话已过期并且令牌不匹配。现在显然这是一个错误,但它不需要杀死所有东西并抛出异常。
有没有办法让它设置一个 Flash 消息,然后重定向回原始页面。我不想禁用 CSRF 保护我只想更优雅地处理错误。
【问题讨论】:
标签: php laravel laravel-5 laravel-5.1
这个有点麻烦,我一般会在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!']);
}
}
不过,您可能需要根据您在应用中处理错误的方式进行调整。
【讨论】:
use Closure; 放在类的顶部,就在namespace App\Http\Middleware; 的下方,或者您可以在声明的开头放置一个反斜杠:public function handle($request, \Closure $next)。
这个可以在app/Handler.php中处理
从
更改渲染功能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);
}
【讨论】: