手拉手带你走进Cookie和Session
永遠の愛
·
·
个人记录
0. 引言
记得那是在很久很久以前,某蒟蒻:哇,冬日绘板开了!
(兴奋尝试后)?这什么呀,点上去的点几秒就没了,别的dalao是怎么做到的啊!
这时,某dalao抛给他一个Cookie。
那是什么呀?饼干?能吃吗?
1.Cookie
1.1 Cookie是啥?
$Cookie$是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
举例:$B$站登录时有一个小框框“记住我”,勾选后下次登录会自动登录,是通过$Cookie$查询历史记录的。
想来真是又可怕又方便。所以,把$Cookie$用好是很重要的!
### $1.2$ 咋看$Cookie$?
此处以$360$浏览器为例:
- 点击右上角打开菜单,里面有设置栏,点进去;

- 点击左边一栏中的“高级设置”;

- 点击“网页内容高级设置”;

- 之后就能看到$Cookie$的所有选项啦,一般设置为允许设置本地数据。点击“所有$Cookie$和网站数据”就能看$Cookie$里的存档了。

### $1.3$ $Cookie$的实现原理?
$Cookie$是由服务器生成,发送给浏览器,浏览器把$Cookie$以$Key-Value$的形式保存到某个目录下的文本文件内,下一次请求同一个网站的时候会把该$Cookie$发送给服务器。由于$Cookie$是存在客户端上的,所以浏览器加入了一些限制确保$Cookie$不会被恶意使用,同时不会占据太多的磁盘空间,每个域的$Cookie$数量都是有限的。

- 图为$http$请求 $+$ $Cookie$的交互过程。(来源:https://www.cnblogs.com/shijianchuzhenzhi/p/6387013.html)
如果步骤$5$中$Cookie$过期或错误,剩下过程将会中断。
### $1.4$ $Cookie$咋写?
一般$Cookie$的脚本由$JS$或者$python$语言实现。
这里给大家提供一些常规命令行,可以用于删除$Cookie$数据:
$Internet$ 临时文件:
$RunDll32.exe InetCpl.cpl,ClearMyTracksByPRocess 8
$RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2
历史记录:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1
表单数据:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16
密码:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
删除全部:
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255
以上为Cookie有关内容
2.Session
2.1 Session是啥?
一次浏览给客户端发一个会话标识($sessionId$,就是一个随机的字符串),每个客户端收到的都不一样,每次客户端向服务端发起$HTTP$请求的时候,就会把这个随机字符串($sessionId$)一并捎过来,这样就能区分开是哪个用户发起的请求了。
$Session$对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的$Web$页之间跳转时,存储在 $Session$对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
服务器开辟了一块空间专门存放$Session$,这个空间叫做$Session$池,$Session$池中可以存放多个$Session$,每个$Session$对应一个客户端(浏览器),比如打开$360$浏览器与$IE$浏览器这就是$2$个客户端,此时在$Session$池中会存在$360$浏览器对应的$Session$与$IE$浏览器对应的$Session$,而每个客户端都会去找自己对应的$Session$。
### $2.2$ $Session$的工作原理?
$Session$主要有三种工作方式:
1. 基于 $URL Path Parameter$,默认支持。
2. 基于 $Cookie$,如果没有修改 $Context$ 容器的 $cookies$ 标识,默认也是支持的。
3. 基于 $SSL$,默认不支持,只有 $connector.getAttribute("SSLEnabled")$ 为 $TRUE$ 时才支持。

上图为基于$Cookie$实现的运行图,步骤如下:
1. 首先客户端(浏览器)发送请求到服务器
2. 请求里面会把客户端(浏览器)所有的$Cookie$带上
3. 服务器接收到请求
4. 内部开始处理,首先从客户端(浏览器)带过来的$Cookie$里面获取$SessionID
-
拿SessionID去Session池中查询
-
如果没有查询到对应的Session或SessionID是空,重新新建一个Session到Session池中
-
如果查询到了直接获取对应Session
-
把数据存入客户端(浏览器)带过来的Cookie,其中就有SessionID,响应给客户端(浏览器)
-
客户端得到响应并把Cookie储存起来
-
接着从1-9循环
关于Session与Cookie结合,我找到了这个网站,大家可以了解。
以上为Session内容
3. 写在最后
由此可见,网络的运行程序还是很复杂的,只有学会网络的运行原理及程序,我们才能更好地用网络!