在VerifyCsrfToken.php中处理TokenMismatchException,刷新Laravel 5中的页面

时间:2016-09-08 13:27:18

标签: php laravel laravel-5 laravel-5.3

Laravel 5.3

我希望在VerifyCsrfToken.php中处理TokenMismatchException。 通常,当我没有刷新当前页面并且前一个令牌持续存在时会发生此异常,因此我重新加载页面,设置了新令牌并且我可以执行登录过程。 好的,但是,我希望处理异常并自动刷新页面。

这可能吗?

1 个答案:

答案 0 :(得分:2)

如果您仍希望在VerifyCsrfToken.php中处理Handle TokenMismatchException 这是laravel 5.3的前进方向。 在中间件目录中找到 VerifyCsrfToken.php

  

应用\ HTTP \中间件\ VerifyCsrfToken.php

确保添加,

  

使用Closure;

避免声明异常错误。 然后添加handle方法来比较sessionToken和表单输入令牌。

public function handle($request, Closure $next)
{
  if($request->input('_token'))
  {
    if ( \Session::getToken() != $request->input('_token'))
    {

      notify()->flash('Your session has expired. Please try logging in again.', 'warning');

      return redirect()->guest('/login');
    }
  }
  return parent::handle($request, $next);
}

生动的见解:完全可选

  • 检查会话令牌是否与请求令牌匹配(隐藏输入中的令牌)

  

dd(\ Session :: getToken()== $ request-> input(' _token'));

  • 记录会话已过期的错误,完全可选
  

\ Log :: error("找到过期的令牌。重定向到/");

  • 使用重定向响应登录页面

  • 来刷新错误消息
  

返回redirect() - >来宾(' /')            - > with(' global','找到过期的令牌。重定向到/');

  • 请注意:

    如果此if语句不为true,则返回值(返回parent :: handle($ request,$ next);)将被执行 这意味着如果令牌出现问题,将抛出错误异常 TokenMismatch 异常)。这可能是因为忘记在表单中添加 {{csrf_field()}} ,因此 $ request-&gt;输入(&#39; _token&#39;)< / strong>无法找到或为空。

  • 注意:

    使用codecourse / notify(https://github.com/codecourse/notify) 闪烁消息,这就是我使用的原因,

  

notify() - &gt; flash(&#39;您的会话已过期。请尝试登录   再次。&#39;,&#39;警告&#39;);

如果您想在没有包的情况下刷新消息,那么它是完全可选的。 你可以使用laravel implimentation。所以它会像

  

返回redirect() - &gt;来宾(&#39; /&#39;)      - &gt; with(&#39; global&#39;,&#39;找到过期的令牌。重定向到/&#39;);