防止Laravel 5.1 CSRF校验错误引发异常

3
我遇到了CSRF异常问题,这些异常是由于完全无辜的原因引起的,例如当某人在填写表单时花费太长时间,最终提交时会话已过期并且令牌不匹配。显然这是一个错误,但它并不需要使所有东西都崩溃并抛出异常。
有没有一种方法只是让它设置一个闪存消息,然后重定向回原始页面。我不想禁用CSRF保护,我只想更优雅地处理这些错误。
2个回答

4

这有点麻烦,我通常会在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!']);
    }
}

虽然如此,您可能需要根据应用程序中的错误处理方式进行微调。


我已经完成了,但现在出现了以下错误:传递给App\Http\Middleware\VerifyCsrfToken::handle()的第二个参数必须是App\Http\Middleware\Closure的实例,而给定的是Closure的实例。 - geoffs3310
5
我认为你只需要在类顶部,在 namespace App\Http\Middleware; 下面加上 use Closure;,或者你可以在声明的开头加上反斜杠:public function handle($request, \Closure $next) - craig_h

1
这可以在 app/Handler.php 中处理。
将 render 函数改为:
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);
}

有没有一种方法可以做到这一点,并返回所有用户的输入? - Fester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接