【问题标题】:Laravel Form sessioin expires after couple of hoursLaravel 表单会话在几个小时后到期
【发布时间】:2017-04-20 19:10:33
【问题描述】:

我正在使用 Laravel 5.2。我遇到了一个问题。我在页面上有一个表格。问题是如果用户打开一个表单并离开 2 到 3 个小时然后尝试提交它会给出 TokenMismatch 错误。它只发生在服务器上而不是我的本地。

这是我收到的错误

我已经阅读了一些关于此的内容,解决方案是将路由包装在 web middlewear 中。我这样做了,但问题仍然存在。我的路线按如下方式分组

  Route::group(
[
    'middleware' => ['dealer', 'web'],
    'prefix' => 'dealer_panel'
],
function () {
      //all routes here
});

我正在为 Laravel 使用共享主机(我知道 Laravel 不适用于共享主机,但我必须处理它)。这个错误永远不会发生在本地,但它总是发生在服务器上。我总是使用Laravel Form helper 来生成类似的表单

 {!! Form::open(['route' => ['dealer.profile.save'], 'id' => 'location_form', 'files' => true]) !!}

并且我已经验证生成了令牌。但它会在 2、3 小时后过期。如何阻止它中断/过期以及处理此问题的方法是什么

【问题讨论】:

  • 你试过thisthis之类的吗?
  • @KuKeC 是,但没有好处。

标签: laravel laravel-5.2


【解决方案1】:

通常基于 config/session lifetime 属性的令牌会话时间。您可以增加它,或者作为替代方法,您可以检查以下内容

1) 在您的 App\Exceptions\Handler 文件中

public function render($request, Exception $e)
{
    if ($e instanceof \Illuminate\Session\TokenMismatchException) {
        return redirect()->back()->withInput()->with('token', csrf_token());
    }

    return parent::render($request, $e);
}

2) 另一种方法是在您的中间件中也可以创建一个新令牌。

3) 使用 ajax 你可以设置间隔时间来重新刷新令牌

    <meta name="csrf_token" content="{{ csrf_token() }}">

    <script type="text/javascript">
        var csrfToken = $('[name="csrf_token"]').attr('content');

        setInterval(refreshToken, 3600000); // 1 hour 

        function refreshToken(){
            $.get('refresh-csrf').done(function(data){
                csrfToken = data; // the new token
            });
        }

        setInterval(refreshToken, 3600000); // 1 hour 

    </script>

    Route::get('refresh-csrf', function(){
      return csrf_token();
    });

【讨论】:

  • 让我试试这个
【解决方案2】:

最好的办法是让他们重新登录。您可以处理令牌不匹配,例如,

public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException){
        //Redirect to login form if session expires
        return redirect('/')->with('login_fail',"Your session has expired, please try again. In the future, reload the current page if it has been open for several hours.");
    }
    return parent::render($request, $e);
}

【讨论】:

    【解决方案3】:

    使用csrf_token 的页面只有这个问题。我在我的应用程序中遇到了令牌过期时间的问题。因此,摆脱这个问题的最简单方法是添加每 n 分钟刷新一次页面的元标记。无需使用 ajax 或其他任何东西,页面将在令牌过期之前刷新,您将不再有此问题。

    例如,如果您的令牌在 1 小时后过期,则每 55 分钟左右刷新一次页面。

    刷新页面的元标记在下面

    <meta http-equiv="refresh" content="900">
    

    值 900 在我的示例中表示 15 分钟。 15 分钟 * 60 秒 = 900

    【讨论】:

    • 除了可用性方面的缺点外,这可能会带来很大的好处,即在用户操作期间刷新,比如填写表格。
    • 如上所述,这是一个糟糕的解决方案。填写表单时,用户将丢失所有工作。
    猜你喜欢
    • 2013-01-06
    • 2018-07-29
    • 1970-01-01
    • 2021-09-12
    • 2016-05-22
    • 2017-05-17
    • 2014-10-24
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多