我正在开发一个RESTful API服务器,它在某些API方法上需要一个有效的会话,以带有会话ID的cookie的形式表示。
我正在使用Yii v1.1.15和库存PHP会话处理程序(可能是'文件')。
事情就是每次调用CWebUser时都会创建一个会话而我不希望这样。只有在我明确创建会话时,才会存在会话,这意味着在登录时(或者自动登录用户的注册)。例如,如果在某个API方法中,我使用包含以下内容的构造检查用户是否是来宾:
Yii::app()->user->isGuest
它自动创建会话,因为此代码在CWebUser.init()中给定。
现在,我并不急于改变CWebUser(事实上,在已经扩展的类中改变它,在其他方面稍微改变了它),因为我担心这会对它产生意想不到的影响。系统。
任何人都可以为此加油吗?
你会做什么?
谢谢!
环境:
// Yii v1.1.15
// session component configuration: (but believe me, I've tried every
// combination - its not really related. Check CWebUser.init()...)
'session' => array(
'class' => 'CHttpSession',
'autoStart' => false,
'sessionName' => 'MY_COOKIE_NAME',
'cookieMode' => 'allow',
'cookieParams' => ['lifetime' => 1000],
'gcProbability' => 33,
'timeout' => 1000,
'savePath' => '/tmp/',
),
// Web User's _allowAutoLogin_ is set on 'false'
答案 0 :(得分:1)
因此,您需要检查用户是否已登录(这就是您使用isGuest
的原因),但您不想使用会话?
方法isGuest
使用会话变量来检查用户是否已登录。会话在创建CWebUser
时打开。 (在您所说的init
方法中。)isGuest
是CWebUser
类的一部分。如果要调用此方法,它将始终创建会话。除非你覆盖它。
我认为你可以采取两种方式:
isGuest
),然后仅在用户未登录时关闭它。您需要覆盖isGuest
方法。在需要时覆盖任何其他方法以打开会话。 (登录/寄存器)在这两种情况下,您都需要覆盖CWebUser.init()
,以便在创建CWebUser
时无法打开会话。
答案 1 :(得分:0)
所以基本上这需要来自以下需求集:
以上的优点?主要是库存PHP会话对登录会话的“免费”管理,包括超时,垃圾收集等。
尽管这种设计最初吸引人,但缺点克服了优势:
所以,我恢复了以下设计: