ECMALL session跨域实现
应用举例: 在data/config.inc.php 中 设置COOKIE_DOMAIN cookie作用域为 .ljlj.cc 后,在 mall.ljlj.cc用户登录后 在 products.ljlj.cc中可以获取到cookie中 ECM_ID.
以ECM_ID前32为字符串为主键 到 ecm_sessions数据表中即可查询到mall.ljlj.cc登录用户的session信息
session 核心文件
文件位置: includes/libraries/session.lib.php 定义session类 SessionProcessor
类中构造函数调用SessionProcessor()方法自定义了ecmall自己的session会话规则
(1) 自定义session会话
1 | session_set_save_handler( |
(2)处理session作用域 作用路径已经 过期时间 实现session跨子域 需要在data/config.inc.php中对 COOKIE_PATH(作用路径) COOKIE_DOMAIN(作用域)进行设置 例: COOKIE_DOMAIN = ‘.ljlj.cc’
1 | $this->gmtime = gmtime(); |
1 | if(defined('ENABLED_SUBDOMAIN')&&ENABLED_SUBDOMAIN && !COOKIE_DOMAIN) |
(3)判断session id为空 但是cookie已经设置 直接取cookie中session id ($session_id默认设置为空)
1 | if($session_id==''&& !empty($_COOKIE[$this->session_name]) |
(4) 如果session id存在 那么截取session id中的后8位验证字符串进行验证
1 | if ($this->session_id) |
(5) 验证字符串 由gen_session_key()函数 产生
sprintf(‘%08x’, crc32(!empty($_SERVER[‘HTTP_USER_AGENT’]) ? $_SERVER[‘HTTP_USER_AGENT’] . ROOT_PATH . $ip . $session_id : ROOT_PATH . $ip . $session_id));
(6) 如果session id 不存在则生成新的 session_id( 32位session_id加8位验证字符串)
调用 gen_session_key() 产生8位16进制验证字符串拼接在session_id后面 存储在cookie中 例: [“ECM_ID”]=> string(40) “8bfc72b2919c2d5f8db0785a24e55fd535ef3589”(后8位为验证字符串)
1 | if (!$this->session_id) |
(7) Session_id 生成函数 gen_session_id() 生成规则为 MD5加密 uniqid(随机数)
1 | function gen_session_id() |
(8) insert_session()方法负责将生成的session插入数据库 db_mall库下 ecm_sessions 表 主键为sesskey (32位 session_id)
(9) _sess_write(32位session_id,用户信息)方法负责update ecm_sessions表中对应sesskey信息
1 | 登录后用户session信息 :例:captcha|s:8:"Z3dydQ==";user_info|a:7:{s:7:"user_id";s:4:"5315";s:9:"user_name";s:6:"wewewe";s:8:"reg_time";s:10:"1436267397";s:10:"last_login";s:10:"1436411543";s:7:"last_ip";s:9:"127.0.0.1";s:8:"store_id";N;s:10:"activation";N; |
退出登录后 session信息:
例:captcha|s:8:”Z3dydQ==”;”