【发布时间】:2012-02-20 04:03:53
【问题描述】:
我正在开发一个包含多个子应用程序的应用程序,我想在 30 分钟不活动后实现自动注销。我有一个使用 Bootstrap.php 的登录和注销操作映射到自定义 /login 和 /logout 路由的 AuthController 以及一个如下所示的前端控制器插件:
class Plugin_SessionTrack extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$employeeSession = new Zend_Session_Namespace('employeeSession');
$employeeSession->setExpirationSeconds(10);
}
}
我是 PHP 和 Zend 的新手,10 秒后会话到底发生了什么?我把它设置得很低以进行测试。我希望发生的情况是,如果通过前端控制器插件的最后一次请求的时间超过 30 分钟,则销毁会话并将用户注销并将其重定向到 /login。
我可以清楚地看到我没有跟踪上次请求的时间,但我希望每次用户通过此 preDispatch 方法收到请求时都会刷新 setExpirationSeconds。
也许需要使用 cookie?我不需要实际启动注销操作,它可以在用户下次发出请求时处理,如果他们在过去半小时内没有做任何事情,则会话被破坏并且他们被注销,这意味着如果我离开 45 分钟,我的屏幕看起来还是一样,但是如果我单击链接或尝试提交我已经准备好的表格,它会将我发送到 /login。以后我可以担心某种类型的 JS 倒计时警告。
编辑:如果有人想看,这是我的引导程序:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**
* Custom routes:
*
* /login
* /logout
*/
protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$loginRoute = new Zend_Controller_Router_Route('login', array('controller' => 'auth', 'action' => 'login'));
$logoutRoute = new Zend_Controller_Router_Route('logout', array('controller' => 'auth', 'action' => 'logout'));
$routesArray = array('login' => $loginRoute, 'logout' => $logoutRoute);
$router->addRoutes($routesArray);
}
protected function _initPlugins()
{
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new Plugin_SessionTrack());
}
}
【问题讨论】:
-
首先定义“不活动”。我们在 php 中看到的只是服务器请求。我真的很讨厌这个建议,但是您可能想使用 javascript 来监视活动,并在它“超时”时调用注销方法。命名空间过期似乎无法满足您的需求。
-
不活动意味着用户没有发布表单,他们没有在控制器中点击操作。基本上他们是“远离键盘”。这所房子的子应用程序是非常数据驱动的,因此如果事情没有影响控制器(操作),它们应该很明显没有使用该应用程序。
标签: php zend-framework session