查看原文
其他

让人琢磨不透的Session和Cookie

IT服务圈儿 2022-09-11

The following article is from 脚本之家 Author Love DN

IT服务圈儿

有温度、有态度的IT自媒体平台


来源:脚本之家(ID:jb51net)


作者 | Love DN

出品 | 脚本之家(ID:jb51net)

web开发这么长时间了,session,cookie ,一直没有深入的理解,理论知识


Session与Cookie


由于http协议是无状态的协议,为了能够记住请求的状态,于是引入了SessionCookie的机制。我们应该有一个很明确的概念,那就是Session是存在于服务器端的,在单体式应用中,他是由Web容器(例如:tomcat)管理的,存在于容器的内存中,而Cookie则是存在于客户端,更方便理解的说法,可以说存在于浏览器。Cookie并不常用,至少在企业或者互联网开发中,并没有什么场景需要我们过多的关注Cookiehttp协议允许从服务器返回Response时携带一些Cookie,并且同一个域下对Cookie的数量有所限制,Session的持久化依赖于服务端的策略,而Cookie的持久化则是依赖于本地文件。虽然说Cookie并不常用,但是有一类特殊的Cookie却是我们需要额外关注的,那便是与Session相关的sessionId,他是真正维系客户端和服务端的桥梁。


Cookie的分类


按照存储的物理介质区分,一类是在web容器的,一类是存储在硬盘的


拿tomcat来说,

1、当请求到达,tomcat会创建request和response

2、session的创建始于request.getSession(true);这里可以传false,即不创建新的

3、创建session的伪代码:

这里create即传入的参数,false直接返回,如果是true的话

当session创建成功后,直接往response里追加sessioncookie,

这里追加的cookie,maxAge是通过

来设置的,默认没有时长,就是存储在浏览器内存的cookie,当窗口关闭后cookie就失效,这就是解释了在访问web容器的时候,cookie是什么时候生成的,对于tomcat来说,默认生成的是如下图所示的Cookie

下面对web容器请求两次,都是http://localhost:8080/cookie

第一次:

首先容器生成session,往response里addHeader一个Set-Cookie,返会客户端

第二次请求

这个时候,浏览器内存已经得到第一次响应的Cookie,直接请求的时候,在request里面就带上cookie

1因为参数中有HttpSession,所以会执行request.getSession(true);当然,直接在请求方法里之心这句也行


那么,对于存储在客户端的本地的cookie怎么设置呢,一样

这样的话,客户端本地就会持久化一个key=value的cookie,后续,在非失效的情况下,即使关掉窗口,请求时也会带有该cookie


修改后第一次请求

第二次

关掉浏览器窗口后,在次请求

那么,本来客户端如果禁用session怎么办,禁用的只是本地存储的session,上述例子就是key=value,对于内存的cookie不会影响,这就是web下的session-cookie机制


题外话:用户登录后,大多web容器是判断是否有session来判断用户,这就导致登录之前和之后的session不变的情况,这属于系统漏洞,web容器不会解决这个问题,这个问题放给别的框架或者系统自行解决

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。





*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存