如何 运行 会话超时时的更新查询
How to run an UPDATE query on SESSION TIMEOUT
我正在开发一个使用 CakePHP 2.8 构建的项目。在登录时,我将 FLAG 设置为 1,在注销时将其设置为 0,以便该帐户一次可以在一台计算机上登录。到这一部分为止效果很好。
我遇到的问题是会话超时。我很困惑如何在会话超时时在数据库中将标志设置为 0。有什么方法可以 运行 会话超时更新查询。
我正在使用 CORE 配置文件来设置 SESSION 超时限制,如下所示:
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => 30, // The session will timeout after 30 minutes of inactivity
'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
'checkAgent' => false,
'autoRegenerate' => true, // causes the session expiration time to reset on each page load
));
这是我的注销功能
public function logout() {
$id = $this->Auth->User('id');
$this->User->updateAll(array('WebLoggedIn'=>0), array('User.id'=>$id));
$this->Auth->logout();
// redirect to the home
return $this->redirect('/');
}
那不行
问题中的想法行不通。与会话相关的移动部分,问题中的配置是:
- 存储在服务器上的文件,其中包含序列化的会话数据,每次写入会话时都会更新
- 标准 php cron 作业,删除已过期的会话文件(参见
/etc/cron.d/php5
或同等内容)
- 一个浏览器 cookie,它将用户的浏览器会话链接到服务器上的文件
当用户的会话超时时 - 这意味着他们提供的会话 ID 与服务器上的文件不对应,或者他们根本没有提供会话 cookie。在它过期时没有“嘿这个会话已过期”事件,并且不能保证用户会提供旧的会话 ID 供您检查它是否有效。
工作提案
一个简单的(这也意味着天真并且可能容易绕过)解决方案是不存储布尔值,而是将他们的会话过期时间存储在数据库中。 IE。有类似这样的代码:
// App Controller
public function beforeFilter()
{
$userId = $this->Auth->user('id');
if ($userId) {
$this->User->updateAll(
array('active_session_expires'=> time() + (30 * 60)),
array('User.id'=>$id)
);
}
}
在用户控制器中:
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
if ($this->Auth->user('active_session_expires') > time()) {
$this->Flash->error('You are still logged in somewhere else');
return $this->logout();
}
$this->User->updateAll(
array('active_session_expires'=> time() + (30 * 60)),
array('User.id'=> $this->Auth->user('id'))
);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error(__('Invalid username or password, try again'));
}
}
public function logout()
{
$id = $this->Auth->User('id');
if ($id) {
$this->User->updateAll(
array('active_session_expires'=> time()),
array('User.id'=>$id)
);
$this->Auth->logout();
}
return $this->redirect('/');
}
即每次他们做某事时 - 更新数据库以跟踪他们的 activity。如果他们在现有会话到期之前尝试登录 - 立即将他们注销。预计需要 test/modify 这个示例代码,提供它是为了给你一个想法,不一定是一个完整和有效的解决方案。
这类似于 。
我正在开发一个使用 CakePHP 2.8 构建的项目。在登录时,我将 FLAG 设置为 1,在注销时将其设置为 0,以便该帐户一次可以在一台计算机上登录。到这一部分为止效果很好。
我遇到的问题是会话超时。我很困惑如何在会话超时时在数据库中将标志设置为 0。有什么方法可以 运行 会话超时更新查询。
我正在使用 CORE 配置文件来设置 SESSION 超时限制,如下所示:
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => 30, // The session will timeout after 30 minutes of inactivity
'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
'checkAgent' => false,
'autoRegenerate' => true, // causes the session expiration time to reset on each page load
));
这是我的注销功能
public function logout() {
$id = $this->Auth->User('id');
$this->User->updateAll(array('WebLoggedIn'=>0), array('User.id'=>$id));
$this->Auth->logout();
// redirect to the home
return $this->redirect('/');
}
那不行
问题中的想法行不通。与会话相关的移动部分,问题中的配置是:
- 存储在服务器上的文件,其中包含序列化的会话数据,每次写入会话时都会更新
- 标准 php cron 作业,删除已过期的会话文件(参见
/etc/cron.d/php5
或同等内容) - 一个浏览器 cookie,它将用户的浏览器会话链接到服务器上的文件
当用户的会话超时时 - 这意味着他们提供的会话 ID 与服务器上的文件不对应,或者他们根本没有提供会话 cookie。在它过期时没有“嘿这个会话已过期”事件,并且不能保证用户会提供旧的会话 ID 供您检查它是否有效。
工作提案
一个简单的(这也意味着天真并且可能容易绕过)解决方案是不存储布尔值,而是将他们的会话过期时间存储在数据库中。 IE。有类似这样的代码:
// App Controller
public function beforeFilter()
{
$userId = $this->Auth->user('id');
if ($userId) {
$this->User->updateAll(
array('active_session_expires'=> time() + (30 * 60)),
array('User.id'=>$id)
);
}
}
在用户控制器中:
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
if ($this->Auth->user('active_session_expires') > time()) {
$this->Flash->error('You are still logged in somewhere else');
return $this->logout();
}
$this->User->updateAll(
array('active_session_expires'=> time() + (30 * 60)),
array('User.id'=> $this->Auth->user('id'))
);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error(__('Invalid username or password, try again'));
}
}
public function logout()
{
$id = $this->Auth->User('id');
if ($id) {
$this->User->updateAll(
array('active_session_expires'=> time()),
array('User.id'=>$id)
);
$this->Auth->logout();
}
return $this->redirect('/');
}
即每次他们做某事时 - 更新数据库以跟踪他们的 activity。如果他们在现有会话到期之前尝试登录 - 立即将他们注销。预计需要 test/modify 这个示例代码,提供它是为了给你一个想法,不一定是一个完整和有效的解决方案。
这类似于