思考:HTTP协议的特点是无状态/无连接,这就意味着即使一个用户打开浏览器后,即使以飞快的速度访问一个网站两次,那么这个网站也无法识别其为同一个用户,那么用户登录后,访问不同的页面时,服务器怎么确定用户在访问其他页面时登录了呢?
引入:HTTP协议的无状态/无连接,在提高通信效率的同时,的确让服务器与浏览器之间的“关系”变得冰冷,这个使用需要通过其他渠道来实现服务器与浏览器的“相识”,这就是会话技术。会话技术分为两部分
- COOKIE技术
- SESSION技术
总结
- HTTP协议最开始是为Web1.0准备的,在Web2.0来临之后,用户就不再是从服务器获取内容这么简单,而是需要不断的与服务器进行交互。所以后来就衍生出了会话技术来实现服务器与浏览器互相识别。
- 会话技术是解决一次会话过程中浏览器与服务器识别的技术(默认浏览器打开到关闭)
- 会话技术主要是帮助浏览器请求服务器时,服务器不同的脚本能够共享数据
一、cookie技术【掌握】
思考:如果浏览器与服务器之间的访问是无状态/无连接的,那么服务器怎么能够做到浏览器第二次访问的时候识别对方已经来过呢?
引入:如果浏览器与服务器之间通信什么都不留下的话,自然是不可能识别的。但是如果浏览器能够带点什么服务器认识的东西过去的话,这个问题就解决了。这就是COOKIE技术。
1. cookie技术认识【掌握】
定义:COOKIE是会话技术中的一种,是利用HTTP协议中增加一组协议:请求协议和响应协议,来实现互相传递数据,从而让服务器能够识别浏览器。
- 浏览器第一次访问服务器的时候,是什么都没有的。因此cookie是由服务器发起的。即服务器在浏览器访问后响应的时候,在响应头总增加一个协议:set-cookie让服务器把数据传递给浏览器
- 浏览器在第一次拿到服务器响应的时候,会解析到set-cookie协议:然后将数据保存到浏览器中
- 浏览器在以后访问的时候,会先寻找浏览器缓存里是不是有对应网站的cookie数据,如果有就使用请求头中的cookie选项把数据携带过去
- 服务器在接收浏览器请求的时候,可以通过请求头中的cookie获取数据,从而判定浏览器有没有访问过,进而达到识别浏览器的特点
总结:cookie技术就是利用HTTP协议中请求协议cookie和响应协议set-cookie来实现互相的数据传递,从而最终实现浏览器与服务器的“有连接”的
思考:cookie技术原理清楚了,服务器与浏览器之间是如何实现的呢?
引入:浏览器的实现很简单,就是内置了一套规则,浏览器会这么做(没有禁用COOKIE)。而服务器的话Apache做不了这件事,只能由PHP来实现
2. cookie技术实现【掌握】
定义:cookie技术实现是PHP利用了HTTP协议规范,在PHP输出数据之前设定设定相关协议实现的。
- PHP设定cookie:PHP提供了一个函数setcookie('名字','值')专门设置cookie
<?php
# 设置cookie
setcookie('first','hello');
- 浏览器保存cookie
浏览器请求该PHP文件时HTTP相应
浏览器中查看cookie:Chrome(F12开发折者工具->application->Cookies->具体网站)
=
- PHP读取cookie:PHP已经设定了系统变量$_COOKIE,直接在里面即可
<?php
# 读取cookie
var_dump($_COOKIE);
- cookie复杂数据存储:cookie只能(建议)存储简单数据,但是如果想要存储多一些或者数组的数据的话,可以使用[]
<?php
# 设置cookie
setcookie('user[name]','Jim');
setcookie('user[age]','30');
总结
- cookie的使用非常简单,只需要在服务器设置cookie和访问cookie即可
- cookie数据的值只能是简单数据,如果非要存储数组数据,可以使用[]和下标形式
思考:cookie数据保留在浏览器上就会一直存在吗?
引入:任何数据的存储都是有周期性的,默认的cookie周期是浏览器关闭,即会话结束
3. cookie高级应用【掌握】
定义:cookie高级应用,即控制cookie的生命周期和访问有效性
- 设定cookie生命周期:cookie的生命周期默认是会话结束,但是可以通过setcookie第三个参数设定时间
<?php
# 设置cookie生命周期
setcookie('second','world');
setcookie('name','Tom',0); #0表示会话周期(浏览器关闭)
setcookie('age',30,time()); #表示设定time()对应的时间戳秒数
# cookie的生命周期设定是从格林威治时间到现在的描述限定的,如果要设定长周期就需要大过当前时间戳算
setcookie('long','long',time() + 7 * 24 * 3600); #7天后过期
有了生命周期之后我们就可以删除cookie了:就是让cookie的生命周期提前到期(会话结束前)
<?php
# 设置cookie生命周期
setcookie('die','die',1);
setcookie('heaven','heaven',time() - 1);
- cookie有路径访问问题:cookie特性是指定目录下的同级目录或者子目录可以访问,而上级目录则不能访问。通常一个网站的cookie是整个网站都可以访问,所以要设定cookie的访问路径为网站根目录“/”
<?php
# 设置cookie访问路径
setcookie('anywhere','anywhere',0,'/'); //当前网站整站可访问
- cookie跨域问题:cookie默认只能当前网站访问(主机名限定),如果想不限定cookie的访问网站的话,可以通过setcookie的第五个参数限定
<?php
# 设置cookie访问限定
setcookie('hole','hole',0,'/','.com'); //所有.com都可以访问
setcookie('home','home',0,'/','taobao.com'); //淘宝下所有网站都可以访问:www.taobao.com/e.taobao.com
总结
- cookie可以通过setcookie的第三个参数设定生命周期,默认是会话结束
- cookie可以通过setcookie的第四个参数来设定访问路径,默认是同级目录及其子目录可访问
- cookie可以通过setcookie的第五个参数来设定访问网站,默认是当前网站
二、session技术【掌握】
思考:有了cookie技术之后,服务器可以实现多个不同的脚本文件共享该数据了。但是数据是通过浏览器来存储的,安全吗?
引入:浏览器上存储的cookie数据是用户可见的,而且js文件可以从浏览器读取所有cookie,所以显然是不安全的。而且如果数据量大的话,浏览器在每次请求服务器时都会带着cookie,这样也是浪费资源的。所以,如果有一些核心数据想要跨脚本共享的话,就要用到session技术。
1. session技术认识【掌握】
定义:session技术是一种存储在服务器端,实现数据跨脚本共享的会话技术,session技术的实现是依赖cookie技术的。
- 浏览器第一次访问服务器时,服务器会设定一个cookie给浏览器,同时服务器会自己创建一个文件把核心数据保存在文件中
- 浏览器依然还是保存cookie数据,但是以后传递给服务器时,服务器会根据cookie数据来打开对应的服务器核心文件,从而取出重要内容
总结
- session是一种保存在服务器端,能够跨脚本共享数据的技术
- session技术的实现依赖cookie技术
思考:session技术的本质是识别操作文件,问题是服务器那么多文件,系统是如何保证文件名字不冲突的呢?
引入:此问题还比较简单,session文件的名字对应的cookie是有一套内部机制生成32位随机字符串,冲突的可能性几乎不可能。
2. session技术实现【掌握】
定义:session技术不是什么时候都需要用到的,一般是重要数据才用。session会利用到HTTP协议以及文件操作来实现。
- session的使用必须开启session:利用PHP函数session_start(),session_start完成了几件事情
- sessionID获取,sessionid就是session文件名字的核心部分
- 读取cookie:固定cookie名字,PHPSESSID,读取到了就直接使用
- 自动生成:没有读到cookie,就自动生成一个sessionID,同时设置cookie,把该id拼凑到响应头中
- 寻找sessionid对应的session文件
- 没有:创建对应文件
- 有:打开文件,读取里面的内容
- 初始化$_SESSION系统变量
- 没有数据:数组为空
- 有数据:存放到$_SESSION中
<?php
# 启用session
session_start();
浏览器访问保存的cookie数据
- session操作继续,不管_SESSION中读写数据
<?php
# 启用session
session_start();
# 访问session数据
var_dump($_SESSION);
# 写入session数据
$_SESSION['userinfo'] = array(
'username' => 'Tom',
'password' => '123456',
'age' => 18
);
- session_start开启后,一直在等待:等待脚本执行结束,session系统自动将$_SESSION中的数据取出来,然后写入到session文件
- 销毁session:即删除当前session文件,同时关闭session系统。session文件默认的是不会自动删除的,除非程序主动删除:可以使用session_desroy()函数来删除session文件
<?php
# 启用session
session_start();
# 删除session
session_destroy();
#session_destroy()使用后session系统就不再检测脚本执行了,不会再次将$_SESSION写入文件
总结
- session必须使用session_start()函数开启
- 只有开启session_start,$_SESSION才能被访问
- session开启的脚本,会在session开启是去访问一次对应的session文件(读取数据),而又会在脚本执行结束后再次访问session文件(写入)
- session_destroy函数可以删除session文件,同时还关闭session系统
思考:session的生命周期怎么控制呢?
引入:session是一种系统内部运行的机制,需要控制session的话,需要修改session的配置项
3. session配置【了解】
定义:session配置,是指根据开发项目的实际需求来调整session的一些特性
- session在php.ini中有很多配置项来控制session的效果
- session.name,session存储cookie的名字,默认是PHPSESSID
- session.auto_start,session是否自动开启,默认是关闭
- session.cookie_lifetime,session设置的cookie的生命周期,默认是会话结束
- session.cookie_path,sessionid在cookie中访问设定,默认是整站访问“/”
- session.cookie_domain,session对应的cookie的跨域访问,默认不允许(本站访问)
- session.gc_maxlifetime = 1440,session文件的生命周期,默认是24分钟
- session.gc_probability = 1,session垃圾回收机制的概率分子
- session.gc_divisor = 1000,session垃圾回收机制的概率分母
注意:即使要修改session效果,通常不会修改配置文件,而是在程序中通过ini_set(配置项,值)来动态实现
- 垃圾回收:指session在开启session后,有一定几率来触发系统回收机制,然后会一次性清理所有过期的session文件
总结
- session的特性都可以通过配置文件来修改,一般都不会修改配置文件修改
- session有自己的回收机制,会偶尔触发,但是一次就会回收所有过期session文件
三、session与cookie对比【掌握】
- 相同点
- 目标都是实现服务器跨脚本共享数据
- 本质都是利用了HTTP协议中的cookie和set-cookie协议
- 不同点
- 安全性方面
- session保存在服务器端,数据安全
- cookie保存在浏览器端,数据不安全
- 数据大小方面
- session以单独文件存储,理论不限
- cookie数量和大小都有限制:20个/4K
- 数据类型方面
- session可以是任何数据类型,系统会自动处理
- cookie只能是简单类型:数值和字符串
- 保存位置
- session保存在服务器端
- cookie保存在浏览器端
- 使用方面
- session是按需访问:开启session_start才访问数据
- cookie是每次都会提交数据
总结
- session比cookie安全
- 重要数据存session,不重要数据存cookie