【会话控制】深度学习SESSION与COOKIE

面试官: 解释一下session和cookie?

应聘者: cookie:

1、cookie存储在客户端,且占用很少的资源,浏览器允许存放300个cookie,每个cookie的大小为4KB,足以满足购物车的要求,同时也减轻了服务器的负荷;

2、cookie为浏览器所内置,使用方便。即使用户不小心关闭了浏览器窗口,只要在cookie定义的有效期内,购物车中的信息也不会丢失;

3、cookie不是可执行文件,所以不会以任何方式执行,因此也不会带来病毒或攻击用户的系统;

4、基于cookie的购物车要求用户浏览器必须支持并设置为启用cookie,否则购物车则失效;

5、存在着关于cookie侵犯访问者隐私权的争论,因此有些用户会禁止本机的cookie功能。

session:

1、session用新的机制保持与客户端的同步,不依赖于客户端设置;

2、与cookie相比,session是存储在服务器端的信息,因此显得更为安全,因此可将身份标示,购物等信息存储在session中;

3、session会占用服务器资源,加大服务器端的负载,尤其当并发用户很多时,会生成大量的session,影响服务器的性能;

扫描二维码关注公众号,回复: 6219188 查看本文章

4、因为session存储的信息更敏感,而且是以文件形式保存在服务器中,因此仍然存在着安全隐患。

以上是大部分面试者会说的,但实际开发中,以上原理固然重要,但并未实际告诉初级PHPer底层到底如何运作,下面就带大家深度学习一下会话控制。

一、为什么需要session?

因为HTTP是无状态的协议,所以当我们发送HTTP请求时如何知道当前用户的状态呢?session就可以很好帮助我们解决这个问题。session可以标识当前的状态。

二、session工作原理?

在这里插入图片描述

整个流程大概分成这样的几步:

第一步将本地的cookie中的session标识和用户名,密码带到后台中

第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID

没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效

失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session

原理图如下:

在这里插入图片描述

三、问题整理

通过查看很多资料以及实践学习,以上是思路整理,但是这中间大家有没有疑惑的地方?比如:

1、为什么session生成的PHPSESSID会存在cookie里?

session生成的PHPSESSID就是存在cookie里的,session机制。

2、session是以什么形式存在的?

session是以文件的形式保存的。php.ini中有个配置项–session.save_path= “”;这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:”sess_[PHPSESSID的值]”。每一个文件,里面保存了一个会话的数据。其实只要使用代码$_SESSION[‘user_id’] = $value;就会促发php的session机制,结果往对应的session文件中写入一个值。

3、session.save_path路径下这么多的session文件,php是如何确定要调用哪个session文件的?

php是依据,一个名为PHPSESSID的cookie,根据它的值,确定要调用哪个session文件的。去浏览器中,可以看到一个cookie名为PHPSESSID,假如它的值为”sess_adbjsf2q1ass26oootd163sf84″,那么,当访问服务器的时候,就会调用session目录下名为”sess_sess_adbjsf2q1ass26oootd163sf84″的文件。其实,PHPSESSID就是一个会话id,以此来确定,哪个是你的会话数据。

总结一下:要说session跟cookie有关联的地方,就是跟PHPSESSID这个cookie有绑定关系。其他,不管你设置什么cookie,使用session的时候是不会用到这些值的。也无法获取到。比如同步登陆,设置即使设置了cookie,而你的应用是依据session判断是否为登陆状态的(事实上也必须如此,因为session保存在服务器端,安全性更高,哪个依据cookie认为你已经登陆,那么很惨)。

所以,这样的情况就会出现,即使成功设置了cookie。也还是不能同步登陆。

4、经常遇到的现象:为什么删除一个session文件,之后生成一个session文件,新的文件名字还是与原来一样?

理解到session文件的命名规则是:“sess_PHPSESSID值“。那么,就很容易明白了。因为,客户端存在cookie:PHPSESSID。客户端发送请求后,会将该cookie发送给服务器(php可以使用$_COOKIE[‘PHPSESSID’]看到其内容),这样的话,还是会根据PHPSESSID生成一个session文件的。

5、如何查看session文件中的session值?

如果想动态、实时知道session的值是如何被改写的,打开一个session文件去查看吧。

6、怎么样理解session_start等函数所做的实际操作是什么?

session_start()生成一个新的session文件名时。会判断是否存在cookie名为PHPSESSID的值。如果存在,那么就会按照它的值,组合成一个文件名”sess_[phpcookie值]”。所以,在目录下,老是能够看到之前删除过的session文件名。如果将浏览器中对应的cookie(PHPSESSID)删掉。那么就不会生成同样的名字了。如果不存在名为PHPSESSID的cookie。php所做的估计为:先发送一个cookie,然后按照cookie的值生成一个(我可以在浏览器中马上看到一个名为PHPSESSID的cookie)

其实,现在也更加深刻地理解了一个知识:在调用session_start()之前不能有任何输出。有输出就会报错。

关于session与cookie的相关优秀文件链接:
1、详解Cookie纪要

猜你喜欢

转载自blog.csdn.net/qq_33055907/article/details/90168242
今日推荐