【问题标题】:How to handle Token Mismatch Exception如何处理令牌不匹配异常
【发布时间】:2016-03-22 11:18:35
【问题描述】:

我打开了一个 Laravel 表单并将其保留了很长时间(5-6 小时)或休眠了我的计算机。经过很长时间或从休眠状态恢复后,当我提交表单时,它显示TokenMismatchException。

我自己没有任何 _token 字段。但是 Laravel 在每个表单中都添加了一个 _token 字段。它看起来像这样:

<input name="_token" type="hidden" value="YLyMGdfLKZESo51SYUHLKAzC6MNRLOQc9D9e2RFq">

我知道存在一些令牌过期问题,但是向客户显示这样的错误消息是不好的。

现在,如果令牌过期,我想将我的应用程序重定向到登录页面或主页,或者显示自定义错误消息而不是 Laravel Token Mismatch 错误。

注意:我不想增加令牌过期时间。

【问题讨论】:

    标签: laravel forms laravel-5 token


    【解决方案1】:

    所有异常都由 App\Exceptions\Handler 类处理

    看看 Laravel 5.1 errors#render-method 你会发现你可以创建一个自定义的 Exeption render,检查下面的例子中的TokenMismatchException 错误,这会将用户重定向到索引视图自定义消息:

    public function render($request, Exception $e)
    {
        if ($e instanceof \Illuminate\Session\TokenMismatchException) {
            return response()->view('index', ['message' => 'custom message'], 500);
        }
        return parent::render($request, $e);
    }
    

    希望这会有所帮助。

    【讨论】:

    • 好的,我已经在handler.php if ($e instanceof TokenMismatchException) { return response()-&gt;view('pages.home', ['message' =&gt; 'Token has been expired'], 500); } 中的render() 方法中添加了这个,让我们等了很久。
    【解决方案2】:

    我还没有升级到 Laravel 5.1,但是从 4.​​2 开始,我使用类似的东西来处理 app/start/global.php 中的令牌不匹配错误:

    App::error(function(Exception $exception, $code)
    {
        // if they get token mismatch, redirect to homepage
        if( strpos($exception->__toString(), 'Illuminate\Session\TokenMismatchException') !== false ){
            return Redirect::route('getHome')->with('notice', Lang::get('messages.sessionExpired'));
        }
    
        // rest of error handling...
    });
    

    我想这需要对 Laravel 5.1 进行一些修改,但我希望它可以帮助你走上正轨!

    这里有一些链接可能会对您有所帮助:

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 2017-10-24
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多