Yii Framework Forum: Cdbhttepsession 成功登陆,却无法保持User信息。 - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Cdbhttepsession 成功登陆,却无法保持User信息。 CDBhttepsession user login Rate Topic: -----

#1 User is offline   donghui 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 05-February 13

Posted 04 April 2013 - 03:39 AM

大家好。

我正在使用cdbhttpsession,去保存用户登陆情况等。

当不使用以下设置时,用户可以正常登陆。。因为默认使用Chttpsession
后来做了以下更改
'session' => array(
'class' => 'CDbHttpSession',
'sessionTableName' => 'sessions',
'autoCreateSessionTable' =>false, (之前时true,后来table存在就改回来了)
'connectionID' => 'db',
'cookieParams' => array('domain' => '.' . $current_domain ),
'timeout' => 36000,
'sessionName' => 'SECSESS',
),

当用户登陆时,一切都正常。
Yii:app()->user->login($identity,$duration); ==> 返回 true
Yii:app()->user->getId(); ==> 返回 ex: 2031


当我更换,或者刷新页面时,就丢失了登陆信息。
Yii:app()->user->getId(); ==> 返回 0
并且 session_id() 返回每次得值都不一样。。。

public function getId()
{
return $this->getState('__id') ? $this->getState('__id') : 0;
}


====================

我有创建了一个新的demo app 去测试,也发现了一样得问题。
是不是在 webuser 得处理上有问题?

另外得问题,在数据库里,每一次用户刷新页面,都会自动在数据表中写入行。。。。

求解--谢谢
0

#2 User is offline   yiqing95 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 598
  • Joined: 27-December 10
  • Location:china

Posted 05 April 2013 - 12:25 AM

一次不要配那么多参数 先配最基本的 都运行ok时 慢慢加参数
我也存在数据库中 但没那种问题:

 'session' => array(
        'class' => 'application.my.components.YsDbHttpSession',
        'sessionName' => 'yiiSpace',
        'connectionID'=>'db',  // important !! if not set will use sqliteDb as storage .
       // 'gCProbability'=>4  , // every 4 request will invoke the Session  GC 测试打开之
       // 'timeout'=>120 ,
    ),

// 自定义session表:

class YsDbHttpSession extends  CDbHttpSession
{

    /**
     * Creates the session DB table.
     * @param CDbConnection $db the database connection
     * @param string $tableName the name of the table to be created
     */
    protected function createSessionTable($db,$tableName)
    {
        $driver=$db->getDriverName();
        if($driver==='mysql')
            $blob='LONGBLOB';
        else if($driver==='pgsql')
            $blob='BYTEA';
        else
            $blob='BLOB';
        $db->createCommand()->createTable($tableName,array(
            'id'=>'CHAR(32) PRIMARY KEY',
            'expire'=>'integer',
            'data'=>$blob,
           // 'user_id'=> " int(11) NOT NULL DEFAULT '0' ",
            'user_id'=> " int(11)  DEFAULT '0' ",
        ));
    }

}
//  主要是添加了一个user_id 字段 用来统计在线人数的


我再也没搞其他的动作了 一切都良好; 你那个感觉要么是每次重建表 要么是session_id 每次都不一样 有可能是cookie设置问题 有个函数 是session重新生成id的 你自己查下 然后用IDE在yii库中搜索下 看什么条件会重新生sessionId 看源代码
0

#3 User is offline   donghui 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 05-February 13

Posted 05 April 2013 - 02:16 AM

View Postyiqing95, on 05 April 2013 - 12:25 AM, said:

一次不要配那么多参数 先配最基本的 都运行ok时 慢慢加参数
我也存在数据库中 但没那种问题:

 'session' => array(
        'class' => 'application.my.components.YsDbHttpSession',
        'sessionName' => 'yiiSpace',
        'connectionID'=>'db',  // important !! if not set will use sqliteDb as storage .
       // 'gCProbability'=>4  , // every 4 request will invoke the Session  GC 测试打开之
       // 'timeout'=>120 ,
    ),

// 自定义session表:

class YsDbHttpSession extends  CDbHttpSession
{

    /**
     * Creates the session DB table.
     * @param CDbConnection $db the database connection
     * @param string $tableName the name of the table to be created
     */
    protected function createSessionTable($db,$tableName)
    {
        $driver=$db->getDriverName();
        if($driver==='mysql')
            $blob='LONGBLOB';
        else if($driver==='pgsql')
            $blob='BYTEA';
        else
            $blob='BLOB';
        $db->createCommand()->createTable($tableName,array(
            'id'=>'CHAR(32) PRIMARY KEY',
            'expire'=>'integer',
            'data'=>$blob,
           // 'user_id'=> " int(11) NOT NULL DEFAULT '0' ",
            'user_id'=> " int(11)  DEFAULT '0' ",
        ));
    }

}
//  主要是添加了一个user_id 字段 用来统计在线人数的


我再也没搞其他的动作了 一切都良好; 你那个感觉要么是每次重建表 要么是session_id 每次都不一样 有可能是cookie设置问题 有个函数 是session重新生成id的 你自己查下 然后用IDE在yii库中搜索下 看什么条件会重新生sessionId 看源代码



用eclipse搜索了一下。 在cdbhttpsession里有重新生成session_id ,我复制粘贴了一下。


public function regenerateID($deleteOldSession=false)
{
$oldID=session_id();

// if no session is started, there is nothing to regenerate
if(empty($oldID))
return;

parent::regenerateID(false);
$newID=session_id();
$db=$this->getDbConnection();

$row=$db->createCommand()
->select()
->from($this->sessionTableName)
->where('id=:id',array(':id'=>$oldID))
->queryRow();
if($row!==false)
{
if($deleteOldSession)
$db->createCommand()->update($this->sessionTableName,array(
'id'=>$newID
),'id=:oldID',array(':oldID'=>$oldID));
else
{
$row['id']=$newID;
$db->createCommand()->insert($this->sessionTableName, $row);
}
}
else
{
// shouldn't reach here normally
$db->createCommand()->insert($this->sessionTableName, array(
'id'=>$newID,
'expire'=>time()+$this->getTimeout(),
));
}
}

谢谢你得帮助,我发现了是cookie参数设置得问题。
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users