yii session 设置过期时间不起作用 [ 1.1 版本 ]
先描述一下我遇到的问题,我的session’__userInfo‘
总是无缘无故消失,
造成Yii::app()->user->getIsGuest()
还是登录状态,
但是Yii::app()->user->__get('u_id')
就报错了。
然后我设置了session 过期时间是3秒,但是它过很久也不过期。
我研究了好久,我错过了什么配置吗?
class WebUser extends CWebUser
{
public function __get($name)
{
if ($this->hasState('__userInfo')) {
$user=$this->getState('__userInfo',array());
if (isset($user[$name])) {
return $user[$name];
} else {
return null;
}
}
return parent::__get($name);
}
public function login($identity, $duration) {
$this->setState('__userInfo', $identity->getUser());
parent::login($identity, $duration);
}
}
class WebUserIdentity extends CUserIdentity
{
private $_id;
private $_isssd;
public $realname;
public $is_login;
public $user;
public function authenticate()
{
$record = User::model()->findByAttributes(array('email'=>$this->username));
if($record===null)
{
$this->errorMessage = '用户名不存在';
$this->errorCode=true;
}
else if($record->password!==md5($this->password))
{
$this->errorMessage = '密码不正确';
$this->errorCode=true;
}
else
{
$this->_id=$record->u_id;
$this->_isssd=$record->u_id;
$this->errorCode = false;
$this->setUser($record);
}
return !$this->errorCode;
}
public function getId()
{
return $this->_id;
}
public function getUser()
{
return $this->user;
}
public function setUser($record)
{
$this->user=$record;
}
}
user model
public function check_user($attribute,$params)
{
$this->_identity = new WebUserIdentity($this->email,$this->password);
$res = $this->_identity->authenticate();
if($res == true){
$duration=Yii::app()->params['sessionTimeoutSeconds'];//(=3)
Yii::app()->user->login($this->_identity,$duration);
return true;
}else{
return false;
}
}
main.php
'session'=>array(
'class'=>'application.components.WHttpSession',
'timeout'=>3,
),
共 4 个回答
-
先把官方的文档看一遍,然后看自己的代码流程
http://www.yiichina.com/doc/guide/2.0/runtime-sessions-cookies共 1 条回复 -
建议看看这篇文章,可能 收获更大
http://www.laruence.com/2012/01/10/2469.html共 1 条回复 -
看文档http://www.yiiframework.com/doc-2.0/yii-web-session.html 有个timeout属性,这个总有收获了吧
共 3 条回复了解原理,你给你写下原理:
这里输入代码 $session = Yii::$app->session; //当session没有值 或 过期时间到 则重新付值 if(!isset($session['user']) || $session['user']['expire_time'] < time()){ $data = [ 'title' => 'data' . time(), //数据 'expire_time' => time() + 10, //这里设置10秒过期 ]; $session['user'] = $data; } var_dump($session['user']);
知道这个原理,你就可以封装函数了,比如封装一个设置过期的session函数了
@数字派 了解原理,你给你写下原理:
这里输入代码 $session = Yii::$app->session; //当session没有值 或 过期时间到 则重新付值 if(!isset($session['user']) || $session['user']['expire_time'] < time()){ $data = [ 'title' => 'data' . time(), //数据 'expire_time' => time() + 10, //这里设置10秒过期 ]; $session['user'] = $data; } var_dump($session['user']);
知道这个原理,你就可以封装函数了,比如封装一个设置过期的session函数了
-
Yii2 框架 配置文件注意cookieParams配置
'session' => [ // this is the name of the session cookie used for login on the backend 'name' => 'advanced-backend', 'class' => 'yii\redis\Session', 'timeout' => 3600, 'cookieParams' => [ 'lifetime' => 36000, 'httponly' => true ], 'redis' => [ 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ], ],
登录过期时间还有一处需注意,且看下面Yii2在登录时官方源代码做了什么,如下:
\advanced\common\models\LoginForm.php 第60行位置/** * Logs in a user using the provided username and password. * * @return bool whether the user is logged in successfully */ public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); } return false; } 可知,在登录勾选“Remember me”后,Yii2自动将登录成功后的状态设置为一个月过期了,所以你感觉是session设置过期时间无效。
Caiyu 觉得很赞
晨泽
注册时间:2013-03-19
最后登录:2015-08-16
在线时长:0小时49分
最后登录:2015-08-16
在线时长:0小时49分
- 粉丝0
- 金钱10
- 威望0
- 积分10