【问题标题】:Session cookie and persisten cookie in MagentoMagento 中的会话 cookie 和持久性 cookie
【发布时间】:2015-02-27 06:28:26
【问题描述】:

我四处寻找这个问题的好答案,但没有找到。基本上我需要我的 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。

【问题讨论】:

    标签: magento


    【解决方案1】:

    这样做应该很简单,假设启用了访问者日志记录,以便将上次访问时间存储在他们的核心会话中。我假设您可以创建或修改 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>
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2016-04-24
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多