Cookie在Laravel 4.1上随机过期

时间:2014-01-13 16:37:22

标签: php cookies laravel

我正在用Laravel 4.1做一个应用程序,当用户登录时,我正在注册一些cookie:

Cookie::queue('adm-chave', $chave, 30);
Cookie::queue('adm-usuario', $usuario->usuario, 30);
Cookie::queue('adm-usuario-id', $usuario->id, 30);
Cookie::queue('adm-usuario-nome', $usuario->nome, 30);
Cookie::queue('adm-usuario-email', $usuario->email, 30);

我做了一个代码来更新每个页面加载的到期时间,如下所示:

Route::filter('logado', function()
{
  $chave = Cookie::get('adm-chave');
  $usuario = Cookie::get('adm-usuario');
  $id_usuario = Cookie::get('adm-usuario-id');
  $nome = Cookie::get('adm-usuario-nome');
  $email = Cookie::get('adm-usuario-email');

  if(empty($chave) || empty($id_usuario)){
    $resposta = Redirect::to('/');
    $resposta->withCookie(Cookie::forget('adm-chave'));
    $resposta->withCookie(Cookie::forget('adm-usuario'));
    $resposta->withCookie(Cookie::forget('adm-usuario-id'));
    $resposta->withCookie(Cookie::forget('adm-usuario-nome'));
    $resposta->withCookie(Cookie::forget('adm-usuario-email'));

    return $resposta;
  }

  Cookie::queue('adm-usuario', $usuario, 30);
  Cookie::queue('adm-usuario-id', $id_usuario, 30);
  Cookie::queue('adm-usuario-nome', $nome, 30);
  Cookie::queue('adm-usuario-email', $email, 30);
});

即使进行了此续订,我的Cookie也会随机过期,并且我的用户会在该块中注销。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

首先我们在config / app.php中添加一个选项,如下所示(我将其设置为24小时):

/*
|--------------------------------------------------------------------------
| Session Files Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes after which old sessions in
| storage will be seen as 'garbage' and cleaned up. Garbage collection may
| occur during session start, depending on the lottery. The default is 24.
|
*/

'files_lifetime' => 24*60,

然后我们创建两个文件。在SessionServiceProvider.php中,我们覆盖SessionManager寄存器以使用我们自己的SessionManager:

<?php namespace YourNamespace\Session;

class SessionServiceProvider extends \Illuminate\Session\SessionServiceProvider {

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->setupDefaultDriver();

        $this->registerSessionManager();

        $this->registerSessionDriver();
    }

    /**
     * Register the session manager instance.
     *
     * @return void
     */
    protected function registerSessionManager()
    {
        $this->app['session.manager'] = $this->app->share(function($app)
        {
            return new SessionManager($app);
        });
    }

}

在SessionManager.php中,我们覆盖getOptions()方法以设置gc_maxlifetime:

<?php namespace YourNamespace\Session;

class SessionManager extends \Illuminate\Session\SessionManager {

    /**
     * Get the session options.
     *
     * @return array
     */
    protected function getOptions()
    {
        $config = $this->app['config']['session'];

        return array(
            'cookie_domain' => $config['domain'], 'cookie_lifetime' => $config['lifetime'] * 60,
            'cookie_path' => $config['path'], 'cookie_httponly' => '1', 'name' => $config['cookie'],
            'gc_divisor' => $config['lottery'][1], 'gc_probability' => $config['lottery'][0],
            'gc_maxlifetime' => $config['files_lifetime'] * 60,
        );
    }

}

这是解决方案来自https://github.com/laravel/framework/issues/2314

的地方