彻底理解cookie和session,不信来打我

场景描述

最近公司的管理系统老是自动掉线,而且这种情况是随机的,不是固定某个时间掉线,也不是固定次数掉线,死活找不到原因,为此特意大量查询资料以及自己的亲自实践。特此总结。
ps:框架采用的是Thinkphp5.1开发。

cookie

英文翻译小甜饼,从字面翻译看不出对于web开发有啥帮助。
淡出的说cookie就是存储在客户端浏览器里面的key-value值,从哪里可以看到呢
在这里插入图片描述
每一个key-value 都是cookie,为啥说cookie不安全呢,因为他对用户是可见的,用户可以自动修改这个值。

cookie还有以下缺点:
单条 存储量有限
浏览器存储的总条数也有限制,不同的浏览器可能默认值还不太一样。

session

session 英文翻译会话,那他和cookie有啥关系呢?
一句话:cookie中存储的某个键对应服务器上某个session文件的文件名。

可能不太容易理解:
这里以登陆后存储用户信息为例:

在讲登陆之前呢,先了解下在浏览器地址栏输入了一个地址之后发生了什么 ?cookie是如何写进来的呢?

以下图为例:
在这里插入图片描述
也就是cookie获取是服务端返回的,然后才会写入浏览器中,这就是为啥有些场景设置完了cookie需要刷新一次才能获取到值。

登陆之前:会话id存储
在这里插入图片描述
我们来看下服务器中对应的文件在哪里
在这里插入图片描述
我们来查看下内容,
在这里插入图片描述
什么东西都没有,当然我们没有进行登陆呢还。

下面登陆过后
在这里插入图片描述
存储的就是我们的登陆信息,这些信息存储的是啥,以php为例就是
$_SESSION里面存储 的所有内容。

session 有效期问题

在php的session,默认存储时间是24分钟,这里说的指的是服务器上那个sess_*文件的有效期,并且这个24分钟是距离最后一次操作的时间,并不是登陆时间,因为你每操作一次,sess文件的时间都会变成你最新的操作时间。在配置文件中由session.gc_maxlifetime = 1440来设置。过期时间=最后操作时间+有效期。
那sess——*过期了会怎样呢,直接删除么?
不不不,过期了之后,不会被立马删除,而是内容被清空,整正的删除是由操作系统自己来定期扫描,问题是php号称最好的语言,却连一个定时GC的线程都没有,靠的是有概率的回收。
在这里插入图片描述
所以又引发了一个问题,多个项目部署在同一台服务器上,如果没有设置session文件的存储位置,默认都会放在同一个目录下,如果用户量太大单个目录文件太多,引发性能问题。因此需要根据项目指定路径存储session。

Cookie有效期

cookie一旦生成之后,哪怕你操作网站,他的有效期也不会发生变化,他的有效期是你打开网站第一次生成的有效期。过期时间=创建时间+有效期。
那么session的有效期从哪里看呢
在这里插入图片描述
有人说不对呀这里没有有效期啊,这个是session级别的,就是当浏览器关闭的时候这个cookie自动失效,但是服务端对应的那个sess不一定过期哦,这一点需要注意的,如果你一个账号登陆的网站A,你把phpsessionid拷贝下来了,关闭浏览器之后,你在把这个id拷贝到浏览器,他可能会保持上一次的状态哦,不信的话,亲们可以亲自试一试。
有人说那我想也手动控制客户端的那个cookie的有效期怎么办?在哪里设置呢?
session.cookie_lifetime = 0

session存储位置

那有人会问了,原来是这样子存储session信息的,那感觉好不安全哦,其实我想说的是如果黑客都能进入你的服务器查看session了还有啥是他看不了的呢。不过既然有这个疑问,session当然可以存储在其他介质中,常见的有数据库,redis,以及其他类型的数据库。
那这个是通过 session.save_handler = files 配置的,files默认就是存储在本地文件,个人建议存储在redis里面,方便查看还有多久过期
使用redis 的ttl key 就可以查看当前会话还有多久过期。

小总结

所谓的cookie的过期时间和session的过期时间没有太必然的联系,但也不能说没有关联,其中的关系需要自己根据文章来理解。
当然session 的东西还有很多这里主要讲平时开发能遇到的。

猜你喜欢

转载自blog.csdn.net/abc8125/article/details/109401080
今日推荐