【问题标题】:Laravel 5.1 prevent CSRF mismatch from throwing exception [duplicate]Laravel 5.1 防止 CSRF 不匹配引发异常 [重复]
【发布时间】:2016-01-12 07:08:07
【问题描述】:

我遇到了向用户抛出 CSRF 异常的问题。它们的发生是出于完全无辜的原因,例如,如果有人在最​​终提交表单时填写表单的时间过长,则会话已过期并且令牌不匹配。现在显然这是一个错误,但它不需要杀死所有东西并抛出异常。

有没有办法让它设置一个 Flash 消息,然后重定向回原始页面。我不想禁用 CSRF 保护我只想更优雅地处理错误。

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.1


    【解决方案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!']);
        }
    }
    

    不过,您可能需要根据您在应用中处理错误的方式进行调整。

    【讨论】:

    • 我已经这样做了,但是我现在收到以下错误:传递给 App\Http\Middleware\VerifyCsrfToken::handle() 的参数 2 必须是 App\Http\Middleware\Closure 的实例,给定的闭包实例
    • 我认为您只需将use Closure; 放在类的顶部,就在namespace App\Http\Middleware; 的下方,或者您可以在声明的开头放置一个反斜杠:public function handle($request, \Closure $next)
    【解决方案2】:

    这个可以在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);
    }
    

    【讨论】:

    • 有没有办法做到这一点并返回所有用户的输入?
    猜你喜欢
    • 2015-11-07
    • 2017-10-28
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2016-10-09
    • 2014-11-21
    相关资源
    最近更新 更多