■ Cookie
一、为什么需要 Cookie ?
首先,我们要知道,http协议是无状态协议。
● 什么是无状态协议?
协议的状态是指下一次传输可以“记住”本次传输信息的能力。
http是不会为了下一次连接而维护本次连接所传输的信息,为了保证服务器内存。
比如客户获得一张网页后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
所以 http是 无状态协议 。
而 DNS 是 有状态协议 。
正因为 http 是无状态协议,如果在一个网站中,有多个页面需要共享同一个信息,那么要如何实现呢?
答:通过 Cookie 和 Session 我们就可以实现多个页面共享同一个信息。
★ Cookie 和 Session 最典型的应用是判定注册用户是否已经登录网站。另一个重要的应用场景是“购物车”之类的处理。用户可能会在一段时间内在同一个网站的不同页面中选择不同的商品,这些信息都会放到 Session“购物车对象” 中,以便在最后付款时提取信息。
二、Cookie 的传递流程:
① 当客户端初次访问某个网站,该服务器程序就会伴随着网页的响应给你一个 Cookie 。
② 当客户端(浏览器)获得并保存了该网站的 Cookie 后,若再次访问该网站(包括通过链接等方式跳转到同一个网站的另一个页面下)这时浏览器会查找机器上是否保存了与该域名相关的 Cookie 文件(浏览器会根据不同的 域名 或 IP 分别保存 Cookie )。
③ 如果找到,浏览器就会把 Cookie 中的数据连同前面输入的 URL 一同发送到网站服务器。
④ 服务器收到 Cookie 数据后,就会在他的数据库中检索你在网站中留下的信息,并把新的内容增加到数据库和 Cookie 中。
⑤ 如果没有找到与该域名相关的 Cookie 或者你的 Cookie 信息与数据库中的信息不符合,则说明你是第一次浏览该网站 或 你的 Cookie 已经丢失。
三、Cookie 的实现原理:
Cookie 是利用网页代码中的 http 头信息 进行传递的。
浏览器的每一次网页请求,都可以伴随 Cookie 的传递。
例如:
浏览器的 打开或刷新 网页操作。服务器将 Cookie 添加到网页的 http 头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的 Cookie设置 选择是否保存这些数据。
就算客户端设置了保存Cookie ,但 Cookie 也会根据服务器中的要求而影响它在客户端中保存的时间。Cookie 有一个 Expires(有效期)属性,这个属性决定了 Cookie 的保存时间,服务器可以通过设定 Expires 字段的数值,改变 Cookie 的保存时间。如果不设置该属性,那么 Cookie 只会在浏览器的运行期间有效,关闭浏览器后这些 Cookie 就会自动消失。绝大多数网站都属于这种情况。
另外 Cookie 的 Path(有效路径)属性,用来指定 Cookie 将被发送到服务器的哪个目录路径下。如果不设置该属性,则 Cookie 在哪个目录下被设置,就只能在该目录及其子目录下有效。
四、Cookie 的限制:
每个域名下的 Cookie 不可能无限多(根据不同浏览器的规定会有不同)一般 30~40 个。
每个 Cookie 也不可能无限大(根据不同浏览器的规定会有不同)一般不能超过 4KB 。
五、$_COOKIE :
预定义变量(超级全局变量)$_COOKIE 代表从浏览器传递过来的 Cookie 信息。
六、PHP 系统函数 setcookie() :
在 PHP 中,我们可以通过系统内置函数 setcookie() 对 Cookie 进行设置,其使用方法如下:
setcookie('名称','内容',有效期,'有效路径','有效域名',是否只通过https传递,是否只通过http传递)
参数解析:
第一个参数代表 Cookie 的名称。
第二个参数代表 Cookie 的内容。
第三个参数代表 Cookie 的有效期,规定要用【时间戳】的形式。
第四个参数代表 Cookie 的有效路径。
第五个参数代表 Cookie 的有效域名,当需要跨域名的时候使用。
第六个参数代表 是否只通过 https 传送。
第七个参数代表 是否只通过 http 传送。
★注意:
① 第三个参数代表 Cookie 的有效期。如果不设置该参数,则 Cookie 只会在浏览器运行期间有效,关闭浏览器后 Cookie 会自动消失(会话级别的 Cookie )。
例如,设置 Cookie 的有效时间为30秒,代码如下:
setcookie('name','content',time()+30); // 通过系统函数 time() 获得当前的时间戳。
在30秒内(有效期内)即使关闭了浏览器,该 Cookie 依然存在。
② 第四个参数代表 Cookie 的有效路径。如果不设置该参数,则 Cookie 在哪个目录下被设置,就只能在该目录及其子目录下有效。
例如,设置 Cookie 的有效路径为根目录(即全站),代码如下:
setcookie('name','content',time()+30,'/');
若设置有效路径为根目录,即该 Cookie 在全站的任何目录中都有效。
③ 在使用系统函数 setcookie() 时,setcookie() 的前面不可以有任何输出语句。
因为当服务器执行 setcookie() 的一瞬间,服务器会给客户端(浏览器)响应一个 Set-Cookie 的头信息。客户端(浏览器)收到该头信息就会设置 Cookie ,然后才处理主体信息。
(★总结:在设置头信息之前不能有任何主体信息输出。)
④ setcookie() 设置的是『发放的 Cookie』(即 服务器 给 浏览器 发送的 Cookie );
而 $_COOKIE 中存放的是『回收的 Cookie』(即 浏览器 给 服务器 传递的 Cookie 信息)。
『发放的 Cookie』与『回收的 Cookie』是不同的,所以修改 $_COOKIE 是改变不了客户端的 Cookie 信息。只能通过 setcookie() 修改要发送给客户端的 Cookie 。反之亦然,通过 setcookie() 也改变不了当前 $_Cookie 中的内容。
七、销毁 Cookie 的方法:
例如:
//有效期为零,意思是该 Cookie 已经过期失效了。
setcookie('username','',0);
setcookie('username','',0,'/');
八、Cookie 的安全问题(Cookie的缺陷):
因为 Cookie 保存在客户端(浏览器),用户很容易修改伪造。所以 Cookie 信息并不可靠,我们需要 Session 。
Cookie的应用场合:
一般用来记录 浏览历史,计数器,等一些跟踪信息,不要存放账户,金额等重要信息。
■ Session
一、为什么需要 Session ?
我们先来举一个生活中的例子:
我们到银行开户存款一般都会获得一张银行卡。如果我们的账户名和银行存款直接写在银行卡上,并且银行只会根据银行卡上的账户名和存款数值判断我们的身份和银行存款。大家觉得这样可行吗?
答案是很明显的,当然不可行 :) 银行卡在我们手上,我们可以更改银行卡上的信息。这无论对银行或者客户都不安全、不可靠。
Cookie 就像是上面所说的银行卡。Cookie保存在客户端,用户可以随意修改它的内容。
那么要怎样解决 Cookie 不够安全的问题呢?
我们还是借鉴生活中的例子,继续回到银行卡上。我们来想想现实生活中的银行卡是怎么样的。
我们使用的银行卡上并没有我们的信息,它只印有一串号码(当然还有磁条、芯片什么 的,但其实性质都一样)。我们的信息保存在银行的内部。我们每次到银行办理业务时,银行会根据我们的卡号在其内部找到我们的信息,并据此进行工作。
服务器 就像是“银行”,我们的信息放在 Session 中,被保存在服务器。
Cookie 就像是我们手上的“银行卡”,它保存了一个 session_id 就像是“银行卡号”。
当我们再次访问服务器时,客户端(浏览器)会找到该 Cookie 并传递给服务器,服务器会根据该 Cookie 中的 session_id 找到对应的 Session文件 ,然后根据 Session文件 中的信息对我们的请求进行处理。
通过 Session 就可以弥补 Cookie 的不足、解决安全问题。
二、Session 的工作流程:
① 当用户首次访问网站的某个页面时,服务器生成一个 Session 用于保存用户的相关信息。该 Session文件 被保存在服务器的指定目录中。而每个 Session 都会有一个与 Session文件 的文件名相关联的 session_id ,例如:
session_id 是 bumv972oav16dr1qv96a1omd92 那么 Session文件名就是 sess_bumv972oav16dr1qv96a1omd92 。
② 服务器会把 session_id 放在 Cookie 中,伴随着网页的响应发送给客户端(浏览器)。
③ 当用户下次访问服务器时,客户端(浏览器)会找到该 Cookie 并传递给服务器,服务器会根据该 Cookie 中的 session_id 找到对应的 Session文件 ,然后根据 Session文件 中的内容对用户的请求进行处理。
三、设置 Session 的保存路径:
在 php.ini 中找到类似以下的内容,并设置:
session.save_path = "D:/……"
四、Session 的常用函数:
● session_start()
————作用:创建新的 Session 或 重用现有的 Session 。也就是说:
如果客户端(浏览器)没有提交 session_id 的话,该函数将会为你制造一个 session_id (即 向客户端响应一个内容为 session_id 的 Cookie)并创建一个与之相关联的 Session文件。
如果客户端(浏览器)有提交 session_id ,该函数将根据 session_id 到指定的目录下查找对应的 Session文件。若没找到对应的 Session文件,则根据 session_id 创建一个新的 Session文件。
★注意:
① 对 Session 进行 读取、编辑、销毁 前都必须先调用 session_start() 函数;
② 用于保存及传递 “session_id” 的 Cookie 的有效路径默认是根目录。
可以在 php.ini 中找到以下内容,并进行设置:
session.cookie_path = /
● session_id([string]) ————作用:获得或设置当前的 session_id 。
● session_unset() ————作用:清空 Session 的内容。
● session_destroy() ————作用:销毁 Session 。
五、$_SESSION :
通过 预定义变量(超级全局变量)$_SESSION 可以直接 读取、编辑 Session 。例如:
session_start();// 对 Session 进行 读取、编辑、销毁 前都必先调用它。
$_SESSION['user'] = '张三';
★注意:这与 Cookie 不同,直接对 $_COOKIE 进行操作影响不了 Cookie ,因为 Cookie 保存在客户端(浏览器)。
六、销毁 Session 的方法:
销毁 Session 从效果来讲有以下三个方法:
//① 销毁保存 “session_id” 的 Cookie :
//注意:用于保存 “session_id” 的 Cookie 的有效路径默认是根目录。
setcookie('PHPSESSID','',0,'/');
//② 把 Session 清空:
$_SESSION = array(); //或 使用系统函数 session_unset();
//③ 销毁 Session :
session_destroy();
七、Session 的有效期:
Session 的有效期受到两个方面的控制:
① 保存 “session_id” 的 Cookie 的有效期;
② 服务器对 Session 文件的清理。
默认情况下,当关闭浏览器 Session 就会失效,注意是 失效!并不是消失。
因为默认情况下,保存 “session_id” 的 Cookie 会随浏览器的关闭而自动消失。但服务器上的 Session文件 依然存在。
★设置保存 “session_id” 的 Cookie 的有效期:
在 php.ini 中找到类似以下的内容,并进行设置:
session.cookie_lifetime = 0
注意:0代表默认情况,即 在浏览器运行期间有效。
★Session 文件的清理机制:
每当服务器被请求时,会通过一定的概率来决定 是否清除已过期的 Session 文件。
如何判断 Session 文件是否已经过期:
根据 Session 文件的最后修改时间 判断其停留时间是否已经超过指定的秒数(默认为:1440秒)。
为什么要通过一定的概率来决定是否清除已过期的 Session 文件呢?
因为每次请求都清除 Session 文件的话,会给系统带来很大的开销。
亦因为上述原因,引发了一个问题:过期的 Session 文件 不能及时地被清除。
解决这个问题的方法:
把 Session 文件存储到 memcached 里,然后给 memcached 设置有效周期。
八、Session 与 Cookie 的主要区别和联系:
区别:
① Session 保存在服务器端,而 Cookie 保存在客户端(浏览器)。
② Cookie 不能存储 数组、对象、资源类型,而 Session 除了资源类型其他类型都可以。(★这也意味着 $_SESSION 有可能是二维甚至多维数组。)
③ Session 通过 session_start() 创建,可以直接通过 $_SESSION 读取和编辑。而 Cookie 可以通过 $_COOKIE 读取,但不能通过 $_COOKIE 编辑。Cookie 的 创建、编辑、销毁 都是通过 setcookie() 实现。
联系:
Session 的操作必须得到 Cookie 的协助,需要通过 Cookie 来完成客户端(浏览器)与服务器之间 “session_id” 的传递。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有