Laravel Form sessioin在几个小时后到期

时间:2016-12-06 07:55:37

标签: laravel laravel-5.2

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

以下是我收到的错误enter image description here

我已经读过这个,其中一些解决办法是在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小时后过期。如何阻止它中断/过期以及解决此问题的方法是什么

3 个答案:

答案 0 :(得分:2)

通常,令牌会话时间基于配置/会话 生存期属性。您可以增加它或作为替代方案,您可以检查以下内容

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你可以setInterval时间来重新标记令牌

    <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();
    });

答案 1 :(得分:0)

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

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);
}

答案 2 :(得分:0)

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

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

刷新页面的元标记位于

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

在我的例子中,900代表15分钟。 15分钟* 60秒= 900