ecshop中的SESSION机制

ecshop中的session机制不是PHP自带的,而是ecshop自定义的一套机制,这两天利用时间学习了一下,以下是学习笔记。

1.session的初始化是在 includes下的 init.php 文件中,具体代码如下:

1 if (!defined(‘INIT_NO_USERS‘))
2 {
3     /* 初始化session */
4     include(ROOT_PATH . ‘includes/cls_session.php‘);
5
6     $sess = new cls_session($db, $ecs->table(‘sessions‘), $ecs->table(‘sessions_data‘));
7
8     define(‘SESS_ID‘, $sess->get_session_id());
9 }

2.cls_session类的构造函数都做什么了?

(1)基础设置,清空session,为成员变量赋值,包括($this->session_cookie_path、$this->session_cookie_domain、$this->session_cookie_secure)

$GLOBALS[‘_SESSION‘] = array();//清空session

        if (!empty($GLOBALS[‘cookie_path‘]))
        {
            $this->session_cookie_path = $GLOBALS[‘cookie_path‘];
        }
        else
        {
            $this->session_cookie_path = ‘/‘;
        }

        if (!empty($GLOBALS[‘cookie_domain‘]))
        {
            $this->session_cookie_domain = $GLOBALS[‘cookie_domain‘];
        }
        else
        {
            $this->session_cookie_domain = ‘‘;
        }

        if (!empty($GLOBALS[‘cookie_secure‘]))
        {
            $this->session_cookie_secure = $GLOBALS[‘cookie_secure‘];
        }
        else
        {
            $this->session_cookie_secure = false;
        }

        $this->session_name       = $session_name; //session名称,默认 ‘ECS_ID‘
        $this->session_table      = $session_table;
        $this->session_data_table = $session_data_table;

        $this->db  = &$db;
        $this->_ip = real_ip();//客户真实IP

(2)获取 session_id,如果cookie中存在就从cookie中获取,如果不存在就设置为空。

1 if ($session_id == ‘‘ && !empty($_COOKIE[$this->session_name]))
2 {
3     $this->session_id = $_COOKIE[$this->session_name];
4 }
5 else
6 {
7     $this->session_id = $session_id;
8 }

(3)如果cookie中存在session_id,就效验此session_id的真实性

if ($this->session_id)
{
    $tmp_session_id = substr($this->session_id, 0, 32);

    if ($this->gen_session_key($tmp_session_id) == substr($this->session_id, 32))
    {
        $this->session_id = $tmp_session_id;
    }
    else
    {
        $this->session_id = ‘‘;
    }
}

(4)如果session_id存在就加载该session_id下的session数据,如果不存在就生成一个session_id并插入到数据库

 1 $this->_time = time();
 2
 3 if ($this->session_id)
 4 {
 5     //如果存在session_id,加载该session_id 下的所有session
 6     $this->load_session();
 7 }
 8 else
 9 {
10     $this->gen_session_id();
11
12     setcookie($this->session_name, $this->session_id . $this->gen_session_key($this->session_id), 0, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure);
13 }

3.cls_session类其它重要方法

(1)gen_session_id() 生成一个session_id,并插入到数据库

function gen_session_id()
{
    $this->session_id = md5(uniqid(mt_rand(), true));

    return $this->insert_session();
}

(2)gen_session_key($session_id) 效验客户端session_id真实性

function gen_session_key($session_id)
{
    static $ip = ‘‘;

    if ($ip == ‘‘)
    {
        $ip = substr($this->_ip, 0, strrpos($this->_ip, ‘.‘));
    }

    return sprintf(‘%08x‘, crc32(ROOT_PATH . $ip . $session_id));
}

(3)insert_session() 插入一条session

function insert_session()
{
    return $this->db->query(‘INSERT INTO ‘ . $this->session_table . " (sesskey, expiry, ip, data) VALUES (‘" . $this->session_id . "‘, ‘". $this->_time ."‘, ‘". $this->_ip ."‘, ‘a:0:{}‘)");
}

(4)load_session() 通过session_id加载session

(5)update_session() 更新session

时间: 2024-08-02 22:54:46

ecshop中的SESSION机制的相关文章

php中的session机制

1.start_session();//开启session,这是必须的. 2.$_SESSION["name"]=$name;//这是赋值. 3.在另一页面获取name ,echo $_SESSION["name"]; 注意有效期:会话周期.

ecshop session机制

ecshop session机制 2014-06-12    1455     懒人程序 ecshop的cls_session.php分析,主要是讲述ecshop中的session机制.我们都知道eschop的session都是存储在数据库中的.ecshop的session都是自定义的.所以当我们研究ecshop二次开发的时候.就不许先研究ecshop的cls_session.php. 1: 构造函数function __construct(&$db, $session_table, $sess

Session机制详解

虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答.     一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,

cookie,Session机制的本质,跨应用程序的session共享

目录:一.术语session二.HTTP协议与状态保持三.理解cookie机制四.理解session机制五.理解javax.servlet.http.HttpSession六.HttpSession常见问题七.跨应用程序的session共享八.总结 一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的.session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动

Session机制详解--转

转自:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答.     一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction

关于HTTP中cookie 和session机制

前言 Cookie是由网景公司的前雇员Lou Montulli 在1993年发明的.向前辈致敬. 1. Cookie和Session介绍  Cookie 和Session 是为了在无状态下HTTP协议之上维护会话状态,使得服务器可以知道当前适合哪个客户在打交道.因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁.是否登录过等.现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更

深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现

1.session的注意点:@session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] session_start()前的输出问题:[session信息本身会增加到http头信息,也就是http主体不能在头前]对php.ini中的输出缓存进行配置,out_buffer的配置[注意:开启之后能够保证输出内容在脚本中缓存] [注意](1)脚本中session变量的键只能是字符串类型的[$_SE

php中session机制的详解

[读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可以查看到session.save_path的具体位置,即服务器session文件的存储位置. 2,php中当启用session_start()之后会在服务器端session.save_path创建一个session文件.文件名包含每个用户唯一的session_id;   session数据从一个页面传递到另一个页面,实际上传递的是一个名字叫phpsessid的cookie到服务器.   服务器接收到这个cookie之后就

javaEE开发中使用session同步和token机制来防止并发重复提交

javaEE开发中使用session同步和token机制来防止并发重复提交 通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交.比如在登陆过程中,通过使用redirect,可以让用户登陆之上重定向到后台首页界面,当用户刷新界面时就不会触发重复提交了.或者使用token,隐藏在表单中,当提交时进行token验证,验证失败也不让提交.这都是一般的做法. 我们这次碰到的问题是重复提交本身就是一个错误,重复提交会导致一些相关数据的逻辑不再正确.而这些重复提交并不是通过普通的刷新