2016-07-29 90 views
0

我正在显示用户会话何时到期的前端倒计时,我想请求剩下的时间而不更新它。Laravel会话提出请求,但不更新会话到期

这是我到目前为止有:

$ttl = Redis::ttl(config('cache.prefix') . ':' . Session::getId()); 
return response()->json($ttl); 

每次这个请求的TTL被重置为session.lifetime值时间。

+0

您正在使用哪个会话驱动程序? –

+0

此外,当然你可以只需要一个倒数等于请求发起时的会话长度? –

+0

我正在使用Redis。是的,我可以这样做,但如果另一个选项卡打开,重置它不会更新。 – Petecoop

回答

0

我解决了这个通过扩展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'); 
0

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

感谢你们,我没有看过'RouteServiceProvider'。我注意到这个项目最初是用5.1创建的,然后升级到5.2,所以它看起来有点不同。我已经扩展了'StartSession'中间件的'terminate'方法来检查请求是否匹配路径。我认为这是更简单的解决方案,因为如果需要的话,我仍然可以使用该路由中的会话来获取任何值。 – Petecoop

0

会话的东西是由Illuminate\Session\Middleware\StartSession中间件处理,它位于web中间件组中。

最简单的解决方案是将您的路线放置在标准的web中间件组之外。

如果您需要任何其他web中间件,您可以将它们添加回路由。

要在路线实际使用的会话,你有两个选择:

  • 你可以做一个会话中间件不终止会话(扩展现有的一个,并覆盖handle方法只需要return $next($request)
  • 有人建议,因为它是一种脱机路由,所以无论您在何处处理路由,都可以手动启动会话(缺少来自现有中间件的代码 - 只有几行代码)。

我认为推荐的解决方案应该是在中间件中完成。

+0

谢谢,我的项目是用Laravel 5.1创建的,升级到5.2,所以它在全局中间件而不是'web'组中。看到我的答案 - 我继续扩展当前的'StartSession'中间件并更改'terminate'方法。 – Petecoop