一、问题
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去访问,服务器也能识别到用户身份。