会话技术

一. 为什么使用会话技术

我们访问网站走的是HTTP协议,协议具有无连接无状态的特性,对事物的处理不具有记忆能力。

我们在web项目中,很多时候需要将会话数据记忆存储,以便后续的程序能够随时调用和使用。

 

我们需要通过会话技术解决以上问题。

 

二. 什么是会话技术

通俗的理解就是“唠嗑”;

 

概念

将数据持久化存储的一种技术。

 

分类

COOKIE技术 和 SESSION技术

 

三.COOKIE技术

COOKIE技术实际上指的就是:将数据持久化存储在浏览器端的一种技术。

 

COOKIE技术实现的基本原理

 

 

我们通过原理图可以了解到:

1, COOKIE数据存储在浏览器端(会话数据区);

2, 如果浏览器端已经存在了某台服务器的COOKIE数据,那么在接下来的所有请求中,都将携带上这些COOKIE数据一并传递到服务器端。

基本操作

COOKIE本质上就是数据,对数据的基本操作其实就是 增 删 改 查。

 

COOKIE的设置(增删改)

设置COOKIE需要注意:设置的COOKIE值只能是字符串,如果不是字符串,将会自动转换成字符串。

新增操作

通过函数setcookie来新增:setcookie(COOKIECOOKIE)

 

 

 

修改操作

通过setcookie函数来实现,名不变,值改变。

 

 

删除操作

通过setcookie函数来实现,名不变,值为空字符串。

 

 

 

COOKIE的查询操作

我们只需要通过$_COOKIE超全局预定义数组变量来查询即可。

 

 

 

COOKIE数据区和$_COOKIE变量之间的关系

 

 

 

通过分析关系原理图:

1, 每次请求后,在服务器端执行程序代码之前,都会将$_COOKIE变量初始化一次,如果没有携带COOKIE数据过来,$_COOKIE变量将被初始化为空数组;如果有携带COOKIE数据过来,$_COOKIE变量将会初始化为数组,携带来的COOKIE数据会成为其元素。

2, Setcookie并不是直接在程序中操作$_COOKIE变量的,setcookie只是负责在响应的时候告诉浏览器需要设置相应的COOKIE数据而已。

 

COOKIE数据的相关属性设置

Setcookie(名,值,有效期,有效路径,有效域,是否安全传输,HTTPONLY);

有效期

通过第三个参数来进行设置

不写或给0值为默认值,表示一个会话周期。

默认的一个会话周期表示从设置后到浏览器关闭为止。

注意:如果设置了过期时间,将以过期时间为销毁COOKIE数据的时间(7天免登录);如果没设置就按默认的一个会话周期走。

 

 

 

注意:我们可以通过设置一个过期了的时间,来达到删除一个COOKIE数据的目的。(重重点)

 

 

 

有效路径

通过设置第四个参数来设置。

不设置或者设置为空字符串表示默认情况。

默认情况为当前目录及其子目录下有效(“有效”二字表示能够访问的到)。

 

 

 

有效域

通过第五个参数来进行设置。

不设置或者设置为空字符串表示默认情况。

默认情况下COOKIE数据只有在当前域名下有效。

 

 

设置的域名为www.home.com

 

 

访问时的域名blog.home.com

 

 

是否安全传输

通过第六个参数来进行设置。

不填或者指定false为默认情况。

默认情况下,httphttps都能访问得到。

如果设置为true,则只能在https下才能够访问。

 

 

 

HTTPONLY

我们一般情况下还可以通过js等一些脚本语言获得保存在浏览器端的COOKIE数据,

以下是通过javascript来获得COOKIE数据的案例:

 

 

 

 

通过第七个参数来进行设置。

不设置或者设置为false表示默认情况。

默认情况下,COOKIE数据能够被其他脚本语言获取。

如果我们设置为true,那么,表示只能通过http传输访问的方式获得。

 

 

我们设置HTTPONLY属性为true后,通过js代码获得COOKIE数据中,不包含我们设置为HTTPONLYuser4这条COOKIE记录。

如下图:

 

 

 

COOKIE技术的局限

1, 在安全性方面,因为COOKIE数据是存放在浏览器端的,不受服务器的限制和控制,所以安全性不高;

2, 如果COOKIE数据量比较庞大的时候,每次请求,都将携带上所有的这些COOKIE数据区请求服务器,将会占用大量的带宽,影响访问速度。

 

由此,我们需要一种技术来规避以上局限性,这个技术就是 SESSION技术

 

四. SESSION技术

概念

将数据持久化存储在服务器端,并且能够是数据区分浏览器的一种技术。

 

基本操作

SESSION数据也是数据,对数据的操作就有 增 删 改 查。

 

开启SESSION机制

我们可以在代码中通过session_start函数来开启SESSION机制。

 

 

 

我们除了能在代码中直接开启SESSION机制以外,还能够通过修改php.ini中的session.auto_start配置项来开启SESSION机制。

 

 

 

如果在配置中开启的session.auto_start,则在代码中不需要通过session_start再次开启SESSION机制,否则报错。

 

 

 

TIPS我们建议使用在代码中通过session_start的方式开启SESSION机制,不是每一个项目或者每一个页面都需要用到SESSION数据,我们的策略是,什么时候用到,就什么时候将它开启。

 

增删改查操作

SESSION数据的增删改查操作,其实就只是对$_SESSION数组变量的增删改查操作,就像操作普通数组一样操作即可。

 

 

 

SESSION技术的原理

 

 

通过分析基本原理图:

1, 当我们首次访问服务器的时候,如果使用到了SESSION,服务器将会新开辟一个SESSION会话数据区,并且为这个数据区生成一个对应的口令(门牌号);

2, 生成的这个口令将会以COOKIE数据的形式存在。(SESSION技术实际上还是依赖于COOKIE技术来实现的

 

SESSION数据区和$_SESSION变量之间的关系

 

 

通过分析关系原理图:

1, session_start时会将$_SESSION初始化一次,如果没有数据则初始化为空数组,如果有数据,则将数据赋值给$_SESSION数组变量作为其元素存在;

2, 程序中操作$_SESSION数组变量,并不是直接操作到了SESSION会话区,只是单纯的操作了$_SESSION这个数组;

3, 当程序运行结束时,才会将$_SESSION中的元素统一保存进SESSION会话区;

 

注意:SESSION技术的实现本质上还是依赖了COOKIE技术才实现的。

 

销毁SESSION(数据区)

我们可以通过session_destroy函数来销毁SESSION会话数据区。

 

 

 

TIPSsession_destroy函数只销毁SESSION数据区,不负责销毁$_SESSION变量,也不负责销毁PHPSESSID

 

SESSION数据的属性控制

我们是通过控制PHPSESSID这条(特殊)COOKIE数据的属性来达到控制SESSION数据的属性的目的。

 

控制PHPSESSID的属性》相当于控制住了整个SESSION会话数据区的属性》就相当于控制住了整个SESSION会话区中所有SESSION数据的属性

 

那么既然PHPSESSID是一条COOKIE数据,那么他也具有COOKIE数据所具有的属性,只不过这个COOKIE数据是由系统来创建出来的,我们需要通过一些特殊的方式来达到控制其属性的目的。

有效期

PHPSESSID的有效期,默认情况为一个会话周期。

一个会话周期表示从设置到关闭浏览器为止。

有效路径

PHPSESSID的有效路径,默认情况为站点的根目录及其子目录下都有效。(这一点有别于普通的COOKIE数据)

有效域

PHPSESSID的有效域,默认情况为当前域名下有效。

是否安全传输

PHPSESSID的这个属性,默认情况为httphttps下都能访问。

HTTPONLY

这个属性对PHPSESSID没有意义。

 

我们需要在php.ini文件中设置相应的配置项来控制PHPSESSID的属性。

 

 

 

 

我们在配置文件中进行配置,将会影响到服务器下所有的项目,不利于管理,所以,我们希望在什么时候用到就在什么时候进行设置。

 

 

 

 

 

TIPS:使用session_set_cookie_params函数必须在开启SESSION机制之前,第一个参数只需要指定多少秒以后过期的秒数即可。

 

案例:禁用COOKIE后如何使用SESSION

 

 

 

 

TIPS如果use_only_cookies设置为1use_trans_sid需要设置为0;如果use_only_cookies设置为0use_trans_sid需要设置为1

 

实现代码

Code17.php

 

 

Code18.php

 

 

 

SESSION的垃圾回收机制

我们可以通过SESSION的垃圾回收机制清理无效的SESSION数据区(空间)。

 

要想实现垃圾回收机制,需要通过配置php.ini中的相应参数来实现。

 

 

 

 

 

 

垃圾回收机制:如果gc_maxlifetime时间内,SESSION数据区没有被使用过,系统将会认为这个SESSION会话数据区已经失效,将会以一定的概率(gc_probability/gc_divisor)进行清除,

posted @ 2017-08-29 12:59  奋斗的黑蜗牛1号  阅读(337)  评论(0编辑  收藏  举报