我使用的是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小时后过期。如何阻止它中断/过期以及解决此问题的方法是什么
答案 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