2016-12-06 82 views
1

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

以下是错误,我得到enter image description here

我看过一些这方面的地方和解决办法是包装在web middlewear路线。我做到了,但问题依然存在。我的路线是一样

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

编组我使用一个共享的主机为Laravel(我知道Laravel是不是共享hostings但我必须处理它)。这个错误从来没有发生在本地,但它总是发生在服务器上。我总是用Laravel Form helper生成表格,如

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

而且我已验证令牌生成。但在2,3小时后它会过期。如何阻止它打破/过期的,什么是处理这个问题

+0

您是否尝试过[this](http://stackoverflow.com/a/27330609/5139222)或[this](http://laravel.io/forum/01-30 -2015-laravel5-tokenmismatchexception-in-verifycsrftoken)? – KuKeC

+0

@KuKeC是的,但没有好处。 –

回答

2

一般基于配置/会话一生 attribute.You可以增加,或作为一种替代令牌会议时间的方式你可以用下面的东西

1)在你的应用程序\例外检查。\处理器文件

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的时间reresh令牌

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

让我试试这个 –

0

,最好的办法是让他们重新登录。您可以处理令牌不匹配等,其使用csrf_token

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

网页只有有这个问题。我的应用中存在令牌过期时间的问题。摆脱这个问题最简单的方法是添加元标记,每n分钟刷新一次页面。不需要使用ajax或其他什么,页面将在令牌过期之前刷新,您不会再遇到这个问题。

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

这刷新页面Meta标记低于

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

价值900代表了我的例子中15分钟。 15分钟* 60秒= 900