Magento中的会话cookie和持久性cookie

时间:2015-02-25 23:02:07

标签: magento

我一直在寻找这个问题的一个很好的答案,但没有找到。基本上我需要我的Magento用户在15分钟后或关闭浏览器后自动注销。非常简单的问题,但到目前为止还没有确定的答案。我知道当生命周期为0时,cookie将成为会话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。

1 个答案:

答案 0 :(得分:1)

这应该很简单,假设访问者日志已启用,以便上次访问时间存储在其核心会话中。我将假设您可以创建或修改Magento扩展,以便我不必指导您完成这些步骤。

在您的扩展程序<controller_action_predispatch>中的config.xml事件上创建观察者。看起来应该是这样的:

<?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>