cookie和session的区别?一文讲透

一、问题

cookie和session的区别?

二、回答

1、总结如下

  • cookie:

- cookie存储于客户端本地,即浏览器缓存

- cookie存储着sessionId,作为后台session缓存的主键,可以快速识别用户身份,减少后台请求

- 问题:数据量较小,不适合存储大数据,如有些图片很大就支撑不了

- 问题:有些服务器禁用cookie,就无法使用cookie

- 替代方案:采用HTML5的Session Storage,支持较大的数据存储

  • session:

- session存储于服务器端,即web服务器缓存

- session存储着登录后用户的基本信息,以减轻数据库服务器的压力

- session后台有设置缓存失效时间,长时间不登录,后台会清除session缓存

- 服务器重启会导致session缓存数据丢失

- 问题:集群数据共享问题,如web1存用户基本信息,web2下单,从web2中无法获取到web1的用户信息

- 替代方案1:使用Redis替代session,实现分布式缓存

- 替代方案2:不使用缓存,将信息写在HTTP协议里,使用token

2、cookie与session交互示意图

如上图,当客户端用户在www.xxx.com网址下输入用户名密码,登录成功,服务器端会为admin这个用户创建一份session缓存空间,存储admin用户的基本用户信息,其主键为sessionId;

服务器端在响应的header中,将sessionId返回给客户端,客户端得到sessionId,会将其存储到本地磁盘中:名称sessionId,值1234,Domain为.xxx.com,还有过期时间等;

当用户继续操作如添加购物车,此时客户端检测到本地有.xxx.com域名的cookie,会自动在请求header中加上该cookie,值为sessionId=1234,发给服务端;

服务器端接收到请求,检测sessionId为1234在缓存区有该主键的session,从而知道用户身份是admin用户,返回成功。

3、cookie的问题及解决方案

(1)清理掉cookie导致重新登录的原因?

当我们将浏览器中的cookie清除掉以后,它会清掉本地存储的sessionId信息,这样再次访问该网站,请求头里没有携带sessionId,后台无法通过sessionId检测到你是谁,就会认为你是没登录过的用户,让你重新登录。

(2)cookie容量较小,现在有的图片很大,无法存储,且有的服务器禁用cookie,如何解决?

可以采用HTML5的Session Storage,以支持较大的数据存储。

4、session的问题及解决方案

(1)长时间不登录导致账号被踢掉的原因?

服务器端的sessionId缓存空间很小,大概只有4k,当大量用户登录,服务器需要为每个用户创建session缓存空间,就不够用对服务器来说有压力,为了解决这个问题就有了session缓存的失效时间,一般为30分钟。

长时间不登录,如超过30分钟,服务器端的session超过失效时间就会自动清掉,此时客户端拿着老的cookie里存的sessionId去访问服务器,服务器检测不到对应的session信息,即不认识你,就会让你重新登录。

(2)服务器重启导致session缓存数据丢失的原因?

因为session数据存在缓存里,又没有落在磁盘上,服务器重启缓存数据会丢失,session缓存数据自然也就没了,这是正常的特性,如同未保存的word文档打开后数据丢失一样。

(3)session真正的问题是:集群环境下的数据共享问题

现在很多后台服务器都是分布式集群环境,比如我有2台web服务器,web1缓存中存储了登录后的用户基本信息,web2下单,那么在web2服务器上想要获取web1缓存中的用户信息是获取不到的。

为了解决这个问题,目前有2种替代方案:

第一种是:利用redis缓存存储,也就是不把缓存缓在单个服务器上,而是缓在一个redis缓存数据库里,这样web1可以写redis,web2读redis,大家都操作一份缓存数据;

第二种是:利用token,也就是用户基本信息不放在缓存中,而是写到http协议里,这样web1登录完了以后,把用户信息放在token里返回,web2操作时带着token去访问,服务器也能识别到用户身份。

相关推荐
core51214 天前
flink yarn模式3种提交任务方式
flink·yarn·任务·session·提交·方式·应用模式
岁岁岁平安16 天前
JavaWeb学习(4)(四大域、HttpSession原理(面试)、SessionAPI、Session实现验证码功能)
java·学习·javaweb·session·httpsession
枫叶丹419 天前
【在Linux世界中追寻伟大的One Piece】HTTP cookie
linux·运维·服务器·http·cookie
gc_229923 天前
学习ASP.NET Core的身份认证(基于Session的身份认证3)
asp.net core·session·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Session的身份认证1)
asp.net core·session·身份认证
GGBondlctrl1 个月前
【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置
java·spring·mvc·cookie·session·header·restcontroller
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证1)
asp.net core·cookie·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证3)
asp.net core·cookie·身份认证
gc_22991 个月前
学习ASP.NET Core的身份认证(基于Cookie的身份认证2)
asp.net core·cookie
爱吃土豆的程序员1 个月前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie