Laravel会话提出请求,但不更新会话到期
我正在显示用户会话何时到期的前端倒计时,我想请求剩下的时间而不更新它。Laravel会话提出请求,但不更新会话到期
这是我到目前为止有:
$ttl = Redis::ttl(config('cache.prefix') . ':' . Session::getId());
return response()->json($ttl);
每次这个请求的TTL被重置为session.lifetime
值时间。
我解决了这个通过扩展StartSession
中间件:
class StartSession extends \Illuminate\Session\Middleware\StartSession
{
public function terminate($request, $response)
{
if (!$request->is('auth/ping')) {
parent::terminate($request, $response);
}
}
}
哪里auth/ping
是我不希望会话保存的路由。
我然后在应用程序容器作为一个单独注册的这一点,所以终止方法解决同一实例:
在AppServiceProvider->register
:
$this->app->singleton('App\Http\Middleware\StartSession');
app/Providers/RouteServiceProvider.php中现有的mapWebRoutes()方法看起来像这样。
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
protected function mapWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/routes.php');
});
}
您可以简单地添加类似以下内容到方法,或者你可以重复上面它加载routes.php文件的代码,并删除Web中间件。
$router->get('session-ttl', function() {
return response()->json(
\Redis::ttl(config('cache.prefix') . ':' . cookie(config('session.cookie')));
);
});
或者
$router->group([
'namespace' => $this->namespace
], function ($router) {
require app_path('Http/routes_wo_web.php');
});
感谢你们,我没有看过'RouteServiceProvider'。我注意到这个项目最初是用5.1创建的,然后升级到5.2,所以它看起来有点不同。我已经扩展了'StartSession'中间件的'terminate'方法来检查请求是否匹配路径。我认为这是更简单的解决方案,因为如果需要的话,我仍然可以使用该路由中的会话来获取任何值。 – Petecoop
会话的东西是由Illuminate\Session\Middleware\StartSession
中间件处理,它位于web
中间件组中。
最简单的解决方案是将您的路线放置在标准的web
中间件组之外。
如果您需要任何其他web
中间件,您可以将它们添加回路由。
要在路线实际使用的会话,你有两个选择:
- 你可以做一个会话中间件不终止会话(扩展现有的一个,并覆盖
handle
方法只需要return $next($request)
) - 有人建议,因为它是一种脱机路由,所以无论您在何处处理路由,都可以手动启动会话(缺少来自现有中间件的代码 - 只有几行代码)。
我认为推荐的解决方案应该是在中间件中完成。
谢谢,我的项目是用Laravel 5.1创建的,升级到5.2,所以它在全局中间件而不是'web'组中。看到我的答案 - 我继续扩展当前的'StartSession'中间件并更改'terminate'方法。 – Petecoop
您正在使用哪个会话驱动程序? –
此外,当然你可以只需要一个倒数等于请求发起时的会话长度? –
我正在使用Redis。是的,我可以这样做,但如果另一个选项卡打开,重置它不会更新。 – Petecoop