Magento 中的会话 cookie 和持久性 cookie
Session cookie and persisten cookie in Magento
我四处寻找这个问题的好答案并找到了 none。基本上,我需要我的 Magento 用户在 15 分钟后或关闭浏览器后自动注销。非常简单的问题,但到目前为止还没有明确的答案。我知道lifetime为0的时候,cookie就变成session cookie,浏览器关闭后就过期了。当生命周期 >0 时,cookie 将成为一个持久性 cookie,它将在一定时间后过期。问题是如何完美地满足这两个条件。
在Mage_Core_Model_Session_Abstract_Varien::start()中,有这段代码:
$cookieParams = array(
'lifetime' => $cookie->getLifetime(),
'path' => $cookie->getPath(),
'domain' => $cookie->getConfigDomain(),
'secure' => $cookie->isSecure(),
'httponly' => $cookie->getHttponly()
);
...
call_user_func_array('session_set_cookie_params', $cookieParams);
...
session_start();
从这段代码中,我无法修改为每个用户访问创建 2 个会话(一个生命周期为 0,另一个生命周期为 900)。
我还尝试修改 Mage_Core_Controller_Varien_Action::preDispatch() 以针对每个用户访问实例化 2 个会话,但它不起作用。
有没有办法让 Magento 用户在 15 分钟后和关闭浏览器后注销?
session.gc_maxlifetime是86400,session.gc_probability是1,session.gc_divisor是100。
这应该很简单,假设启用了访问者日志记录,以便上次访问时间存储在他们的核心会话中。我假设您可以创建或修改 Magento 扩展,这样我就不必引导您完成这些步骤。
在您的扩展 config.xml
中的 <controller_action_predispatch>
事件上创建一个观察者。它应该看起来像这样:
<?xml version="1.0"?>
<config>
<frontend>
<events>
<controller_action_predispatch>
<observers>
<logoutInactive>
<class>My_MyExtension_Model_Observer</class>
<method>logoutInactive</method>
</logoutInactive>
</observers>
</controller_action_predispatch>
</events>
</frontend>
</config>
在 Observer.php
文件中,您的方法应如下所示:
class My_MyExtension_Model_Observer
{
public function logoutInactive(Varien_Event_Observer $observer)
{
$session = Mage::getSingleton('customer/session');
if ($session->isLoggedIn()) {
$lastVisit = Mage::getSingleton('log/visitor')->getLastVisitAt();
$timeout = Mage::getModel('core/date')->date('Y-m-d H:i:s', '15 minutes ago');
if ($lastVisit < $timeout) {
$session->logout();
}
}
return $this;
}
}
您还需要确保您的观察者在 Mage_Log_Model_Visitor::initByRequest
之后触发,因为这将初始化您的观察者将在同一事件中使用的访客日志。这应该不是问题,但声明此依赖项应该确保您的观察者稍后被调用。在您的模块定义中(即 app/etc/modules/My_MyExtension.xml
):
<?xml version="1.0"?>
<config>
<modules>
<My_MyExtension>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Log/>
</depends>
</My_MyExtension>
</modules>
</config>
我四处寻找这个问题的好答案并找到了 none。基本上,我需要我的 Magento 用户在 15 分钟后或关闭浏览器后自动注销。非常简单的问题,但到目前为止还没有明确的答案。我知道lifetime为0的时候,cookie就变成session cookie,浏览器关闭后就过期了。当生命周期 >0 时,cookie 将成为一个持久性 cookie,它将在一定时间后过期。问题是如何完美地满足这两个条件。
在Mage_Core_Model_Session_Abstract_Varien::start()中,有这段代码:
$cookieParams = array(
'lifetime' => $cookie->getLifetime(),
'path' => $cookie->getPath(),
'domain' => $cookie->getConfigDomain(),
'secure' => $cookie->isSecure(),
'httponly' => $cookie->getHttponly()
);
...
call_user_func_array('session_set_cookie_params', $cookieParams);
...
session_start();
从这段代码中,我无法修改为每个用户访问创建 2 个会话(一个生命周期为 0,另一个生命周期为 900)。
我还尝试修改 Mage_Core_Controller_Varien_Action::preDispatch() 以针对每个用户访问实例化 2 个会话,但它不起作用。
有没有办法让 Magento 用户在 15 分钟后和关闭浏览器后注销?
session.gc_maxlifetime是86400,session.gc_probability是1,session.gc_divisor是100。
这应该很简单,假设启用了访问者日志记录,以便上次访问时间存储在他们的核心会话中。我假设您可以创建或修改 Magento 扩展,这样我就不必引导您完成这些步骤。
在您的扩展 config.xml
中的 <controller_action_predispatch>
事件上创建一个观察者。它应该看起来像这样:
<?xml version="1.0"?>
<config>
<frontend>
<events>
<controller_action_predispatch>
<observers>
<logoutInactive>
<class>My_MyExtension_Model_Observer</class>
<method>logoutInactive</method>
</logoutInactive>
</observers>
</controller_action_predispatch>
</events>
</frontend>
</config>
在 Observer.php
文件中,您的方法应如下所示:
class My_MyExtension_Model_Observer
{
public function logoutInactive(Varien_Event_Observer $observer)
{
$session = Mage::getSingleton('customer/session');
if ($session->isLoggedIn()) {
$lastVisit = Mage::getSingleton('log/visitor')->getLastVisitAt();
$timeout = Mage::getModel('core/date')->date('Y-m-d H:i:s', '15 minutes ago');
if ($lastVisit < $timeout) {
$session->logout();
}
}
return $this;
}
}
您还需要确保您的观察者在 Mage_Log_Model_Visitor::initByRequest
之后触发,因为这将初始化您的观察者将在同一事件中使用的访客日志。这应该不是问题,但声明此依赖项应该确保您的观察者稍后被调用。在您的模块定义中(即 app/etc/modules/My_MyExtension.xml
):
<?xml version="1.0"?>
<config>
<modules>
<My_MyExtension>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Log/>
</depends>
</My_MyExtension>
</modules>
</config>