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

什么是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

<?php
date_default_timezone_set('Asia/Shanghai');

class SysSession implements SessionHandlerInterface
{
    private $link;

    public function open($savePath, $sessionName)
    {
        $link = mysqli_connect("localhost","root","","xiaoshuo");
        if($link){
            $this->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

<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 0);
ini_set("session.use_trans_sid", 1);
date_default_timezone_set('Asia/Shanghai');

require_once('session.php');

session_start();

$_SESSION['var1'] = "Just Test";
echo "<a href='page2.php'>测试</a>";
?>

page2.php

<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_only_cookies", 0);
ini_set("session.use_trans_sid", 1);
date_default_timezone_set('Asia/Shanghai');

require_once('session.php');

session_start();

if(isset($_SESSION['var1'])){
    echo $_SESSION['var1'];
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值