资讯专栏INFORMATION COLUMN

session保存数据库中以及禁用cookie情况下的处理

keithyau / 1184人阅读

摘要:保存这个的方式可以采用,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。存放数据到数据库中的默认存放是通过建立一个名为的文件进行存放。

什么是session

HTTP协议是无状态的,我们在浏览一个网站的时候 网站并不知道你是谁,为了解决这一点于是有了==会话管理==
会话管理主要包括cookie和session。cookie可以在客户端记录下信息,而session则是记录信息在服务器上。典型的应用场景:当我们登录一个网站,我们的登录信息就会存放在session当中,接下来在一些需要用户登录下才能操作的地方就可以通过session来判断用户的合法性。用户每次登录得到的==会话ID==是唯一的,这个会话ID可以保存在客户端中或者进行网络传输。客户端也就可以通过cookie或者url传输来传递这个会话ID获取存在服务器上的session信息

session的原理

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。

存放session数据到数据库中

session的默认存放是通过建立一个名为sessionID的文件进行存放。
使用MySQL保存session会话较files有很多优点:
1) 有利于分布式系统,files只能保存在一台机器上
2) 有利于大访问量的系统,使用files时每个session保存在一个文件中,目录会超级大,查找session文件会比较困难。

禁用cookie的影响

由于cookie可以被人为的禁止,服务端就无法在用户本地保存session id,我们需要一种变通的方法来实现session机制。

实现过程

更改php.ini文件。
找到

//php默认保存session的方式
session.save_handler=files
//使用cookie(session cookie)来存储session id
session.use_cookies = 1
//只使用session cookie来存储session id。
session.use_only_cookies = 1
//session cookie的名称为PHPSESSID。
session.name = PHPSESSID
//seesion cookie的生存周期,默认情况下,浏览器一旦关闭,session就会被销毁
session.cookie_lifetime = 0
//让PHP自动跨页传递session id
session.use_trans_sid = 0; 

修改为

//把session的模式改成用户自定义
session.save_handler=user
session.use_cookies = 0
session.use_only_cookies = 0
//让PHP自动跨页传递session id
session.use_trans_sid = 1

通过session_set_save_handler() 设置用户自定义会话存储函数

测试代码
//Database
CREATE TABLE `Session` (
  `Session_Id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `Session_Expires` datetime NOT NULL,
  `Session_Data` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`Session_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SELECT * FROM mydatabase.Session;

session.php

link = $link;
            return true;
        }else{
            return false;
        }
    }
    public function close()
    {
        mysqli_close($this->link);
        return true;
    }
    public function read($id)
    {
        $result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = "".$id."" AND Session_Expires > "".date("Y-m-d H:i:s").""");
        if($row = mysqli_fetch_assoc($result)){
            var_dump($row);
            return $row["Session_Data"];
        }else{
            return "";
        }
    }
    public function write($id, $data)
    {
        $DateTime = date("Y-m-d H:i:s");
        $NewDateTime = date("Y-m-d H:i:s",strtotime($DateTime." + 1 hour"));
        $result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = "".$id."", Session_Expires = "".$NewDateTime."", Session_Data = "".$data.""");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function destroy($id)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE Session_Id ="".$id.""");
        if($result){
            return true;
        }else{
            return false;
        }
    }
    public function gc($maxlifetime)
    {
        $result = mysqli_query($this->link,"DELETE FROM Session WHERE ((UNIX_TIMESTAMP(Session_Expires) + ".$maxlifetime.") < ".$maxlifetime.")");
        if($result){
            return true;
        }else{
            return false;
        }
    }
}
$handler = new SysSession();
session_set_save_handler($handler, true);
?>

page1.php

测试";
?>

page2.php

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23007.html

相关文章

  • CookieSession 区别汇总

    摘要:无状态协议无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。是通过客户端保持状态的解决方案。而这次,信息则存放在请求头了。 HTTP无状态协议 HTTP无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方...

    Kross 评论0 收藏0
  • CookieSession 区别汇总

    摘要:无状态协议无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。是通过客户端保持状态的解决方案。而这次,信息则存放在请求头了。 HTTP无状态协议 HTTP无状态协议,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方...

    Jinkey 评论0 收藏0
  • Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

    摘要:于是乎服务器向用户浏览器发送了一个名为的,它的值是的值。标记着该用户已经登陆了跳转到其他页面,告诉用户成功登陆了。注册多个用户,不断发帖子,扰乱正常发帖秩序。在处理表单的中刷新。监听用户提交事件。 什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种...

    Java_oldboy 评论0 收藏0
  • Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

    摘要:于是乎服务器向用户浏览器发送了一个名为的,它的值是的值。标记着该用户已经登陆了跳转到其他页面,告诉用户成功登陆了。注册多个用户,不断发帖子,扰乱正常发帖秩序。在处理表单的中刷新。监听用户提交事件。 什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种...

    fox_soyoung 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<