Magento session机制的分析与应用

 

Magento session机制的分析与应用


Magento session实现一定是基于php、apache的,呵呵,因为Magento是基于php写的,一般运行在apache web服务器上。所以理解php、apache本身的session实现机制对理解Magento session实现有很大的帮助.

php apache session的机制简要说明

您可以新建一个test.php文件,文件内容如下:
代码块1:

  1. <?php
  2. session_start();
  3. $_SESSION['string'] = ‘string value’;
  4. $_SESSION['array'] = array(‘key1′ => ‘key value1′, ‘key2′ => ‘key value2′);

打开浏览器,输入http://yourdomain/test.php,如果您是第一次访问这个domain(如果不是,建议你先清除掉cookie),
此时您可以打开FF,您可以在代码调试器中看到:

Response Headers 说明web服务器把回给浏览器的东东,其中蓝色底部份设置了一个cookie给浏览器,存储在客户端,供后继使用.
我们重点要分析一下蓝色底部份设置,这里给浏览器设置了下cookie 其中cookie的id为:PHPSESSID,值为随机生成的一串数据(可以看出)。在服务端我们要向客户端写cookie,一般要通过编码的方式,如在php中使用:setcookie这个方法。但是从代码块1中我们并没有使用setcookie方法向客户端写cookie,那它这个cookie是怎样写过去的呢,原因只有一个,由session_start();写过去的。那cookie的key PHPSESSID这个值又是来自那里呢?
我们看一下php.ini文件中的如下几行代码:
代码块2

  1. session.name = PHPSESSID; Initialize session on request startup.
    session.auto_start = 0; Lifetime in seconds of cookie or, if 0, until browser is restarted.
    session.cookie_lifetime = 0

     

    ; The path for which the cookie is valid.
    session.cookie_path = /

    ; The domain for which the cookie is valid.
    session.cookie_domain =

    ; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript.
    session.cookie_httponly =

从以上配置信息可以看到session.name就是用来设置这个cookie的id的.一般会在服务器上生成一个sess_*(随机生成的串)的文本文件(我没修改过session.cookie_path,使用的是window操作系统,生成在windows/temp目录下).
内容如下:
代码块3:

  1. string|s:12:”string value”;array|a:2:{s:4:”key1″;s:10:”key value1″;s:4:”key2″;s:10:”key value2″;}

这是一个josn对象,是代码块1,行3,4的结果.
到目前为止,服务器端把用户的session 数据以cookie名为PHPSESSID的值作为文件名保存在服务端了,同时把这个cookie发送到了客户端,保存到了客户端的硬盘上,其实在服务端和客户端建立了一个联系.
我们再新建一个页面get_session.php:
代码块4

  1. <?php
  2. session_start();
  3. echo ($_SESSION['string']);
  4. print_r($_SESSION['array']) ;

此时,您可以打开FF,您可以在代码调试器中看到:

此时Response Headers中没有了set-cookie了,而在Request Headers中有一个Cookie蓝色底部份,这里的数据是客户端发送到服务端的cookie数据。服务器中的session_start()会拿到PHPSESSID这个cookie,从而得到这个cookie的值,再到文件系统中去读取那个文件,把文件的内容还原到_SESSION变量中,从而用来识别这个用户.只要用户不清除cookie和cookie没有到期,那么用户访问这个domain中的任一页面,都会带着这个cookie提交到服务端,从而服务端可以识别是这个用户.

修改PHPSESSID为您自定义的值

默认情况下我们使用PHPSESSID这个词作为前后台(客户端和服务器端)的沟通桥梁,但是一般在我们的应用中,我们不想使用这个词,那么我们可以通过php自带的方法session_name()这个方法修改。
代码块5:

  1. <?php
  2. session_name(‘frontend’);
  3. session_start();
  4. $_SESSION['string'] = ‘string value’;
  5. $_SESSION['array'] = array(‘key1′ => ‘key value1′, ‘key2′ => ‘key value2′);

这样在第一次set-cookie时不再使用PHPSESSID,而是变成了frontend.session_name一定要在session_start之前调用,不然不会起作用.
当然在取$_SESSION中的值是也要在session_start之前调用session_name方法,如下:
代码块6:

  1. <?php
  2. session_name(‘frontend’);
  3. session_start();
  4. echo ($_SESSION['string']);
  5. print_r($_SESSION['array']) ;

Magento session的机制

(1):Magento中的前台和后台的session是分开的,也就是说前台和后台使用不同的key值进行客户端和服务器会话沟通,前端使用frontend后台使用adminhtml,这样前台和后台同时在一台机上使用时,不会发生seesion混乱的情况.
(2):session数据,一般都是保存在$_SESSION这个全局变量中,但是在Magento中,$_SESSION数据被分成很多组,每一个组由一个session类进行封装。看如下Magento中session类图:

一看到Varien_Object类,我们就会想到有一个_data类变量保存这个类的数据,同时提供写数据方法(set/setData)和读数据的方法(get/getData).
上图中带色部份,为最底层业务实现的session类,用来分离$_SESSION中的数据,进行分别的管理。如Mage_Core_Model_Session中的分组名为:core,Mage_Customer_Model_Session的分组名为customer,Mage_Checkout_Model_Session中的分组名为checkout.那么现在$_SESSION中的实际数据看上去如下$_SESSION=array(‘core’=>array(…), ‘customer’=>array(…), ‘checkout’=>array(…),…)其中Mage_Core_Model_Session,Mage_Customer_Model_Session,Mage_Checkout_Model_Session中的_data分别拥有core,customer,checkout中数组的引用,所以对这三个类中的_data操作,实际上是对全局变量$_SESSION中的三个数组的操作。如果我们要自定义自己的$_SESSION中的数据分组,可以定义一个类似上面的类,并在此类中定义其$_SESSION中的分组就可以了。
(3):Magento中session的初始化:
在Mage_Core_Controller_Varien_Action类中(用户控制器中的项层类)的preDispatch方法中有如下代码:
代码块7

  1. $namespace = $this->getLayout()->getArea();
  2. Mage::getSingleton(‘core/session’, array(‘name’ => $namespace))->start();

其中第一行中得到的area值是在前端用户控制器类(Mage_Core_Controller_Front_Action)和后台用户控制器类(Mage_Adminhtml_Controller_Action)中preDispatch方法中设置的frontend和adminhtml,这个值其实是我们上面分析的session_name的值。
行2初始化了一个core/session类,其实是Mage_Core_Model_Session类的实例,此类的初始化方法如下:
代码块8:

  1. public function __construct($data=array())
  2. {
  3. $name = isset($data['name']) ? $data['name'] : null;
  4. $this->init(‘core’, $name);
  5. }

第3行得到的值为frontend或者adminhtml(根据前后台不同此值不同),第4行将调用父类的Mage_Core_Model_Session_Abstract中的init方法,这里有两个参数,每1个是在$_SESSION中的分组的名称,第2个是session_name的值,由于这是每一次调用,所经要设置session_name,如果是后继的使用,则不一定要传这个值。Mage_Core_Model_Session_Abstract中的init方法:
代码块9:

  1. public function init($namespace, $sessionName=null)
  2. {
  3. parent::init($namespace, $sessionName);
  4. $this->addHost(true);
  5. return $this;
  6. }

第3行代码调用他父类(Mage_Core_Model_Session_Abstract_Varien)的init方法,把分组名和session_name传入.此init方法定义如下:
代码块10:

  1. public function init($namespace, $sessionName=null)
  2. {
  3. if (!isset($_SESSION)) {
  4. $this->start($sessionName);
  5. }
  6. if (!isset($_SESSION[$namespace])) {
  7. $_SESSION[$namespace] = array();
  8. }
  9. $this->_data = &$_SESSION[$namespace];
  10. $this->validate();
  11. $this->revalidateCookie();
  12. return $this;
  13. }

行3,在没有调用session_start();之前,$_SESSION是没有被定义的,所以初始化时,行3是一定会被执行的,只要初始化后,行4是不被执行了。所以start方法在初始化时是会执行的,代码块7行2中的start()方法其实是不必要调的.行5-8如果分组中在$_SESSION没有,此先建立这个分组。行9把$_SESSION中分组的引用给session类中的_data.
start()方法您可以跟进去看一下,这个方法主要是说明:我们的session数据在服务端已一种什么方式存储。Magento1.3支持:文件、数据库、memcache。同时设置session_name,和cookie的一些参数据。
(4):Magento session中数据的使用,由于Magento中的$_SESSION中的数据被分成很多组(根据业务)封装到了各自的业务对象中,所以我们如果要取session中的数据,不要直接到$_SESSION中去取,而应该到这些封装类的中去取,如你要得到当前登录用户的一些信息或者看当前用户是否登录了,你可以到Mage_Customer_Model_Session中去取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`HttpPostActionInterface`是Magento 2框架中的一个接口,用于处理HTTP POST请求。它定义了一个方法`execute()`,该方法接收一个`RequestInterface`对象作为参数,并返回一个`ResultInterface`对象。 具体来说,当一个HTTP POST请求被发送到Magento应用程序时,Magento会根据请求中的路由信息调用相应的控制器类。控制器类将实现`HttpPostActionInterface`接口,并在`execute()`方法中执行请求处理逻辑。在`execute()`方法中,开发人员可以根据请求参数执行相应的操作,并返回一个表示操作结果的`ResultInterface`对象。 例如,以下代码片段演示了如何实现一个自定义的`HttpPostActionInterface`控制器类: ```php use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Framework\App\RequestInterface; use Magento\Framework\Controller\ResultFactory; class MyController implements HttpPostActionInterface { public function execute(RequestInterface $request) { // 获取请求参数 $param1 = $request->getParam('param1'); $param2 = $request->getParam('param2'); // 执行相应的操作 // ... // 返回操作结果 $result = $this->resultFactory->create(ResultFactory::TYPE_JSON); $result->setData(['success' => true, 'message' => '操作成功']); return $result; } } ``` 在上述示例中,我们通过`$request->getParam()`方法获取了请求中的参数,并执行了相应的操作。最后,我们创建了一个JSON格式的`ResultInterface`对象并返回它,表示操作成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值