面试问答1:cookie 和 session的区别

共同点

都是会话跟踪技术

在聊区别之前,我们先来看看它们的由来

HTTP协议

Hyper Text Transfer Protocol 超文本传输协议

特点

  • 支持客户/服务器模式
  • 简单快速
  • 灵活
  • 无连接
  • 无状态

由于HTTP是无状态的协议,自身不对请求和响应之间的通信状态进行保存,意味着如果后续的处理工作需要前面的信息,则必须重传。为解决这个问题,引入了cookie和session机制,进行会话追踪。

一篇精彩的HTTP解读


cookie

当浏览器第一次发送请求到服务端后

服务端会创建一个Cookie,该Cookie中包含用户信息(sessionID),然会将其放在响应头中,发送到浏览器。

当浏览器接受到响应信息后,将cookie存到浏览器的缓存中。

在浏览器再次向服务端发起请求时,就会带上这个由服务端自己创建的cookie,发送到服务端。

服务端接收到请求后,根据收到的cookie信息区分不同的用户。

session

当浏览器第一次向服务端发起请求,服务端接收到浏览器发来的请求后(代码层面:servlet中调用getsession()),会根据特殊算法生成一个SessionID(随机串),同时创建一个HttpSession对象,并以键值对的形式存入Session列表(一个map结构的记录表)中。

当服务端向浏览器返回响应时,服务端将SessionID(session列表中的键)包装成Cookie,放在响应头中,发送到客户端。

当客户端受到响应后,将cookie存入浏览器的缓存中,当用户再次发起请求时,就会带上cookie(实际上是带着session ID),放在请求头中,发送到服务端。

服务端接收到此次请求后,接受到了请求头中的cookie信息,拿着这个sessionID,到session列表中去查找对应的session对象,找到后就可以对session对象的域属性继续继续读写了。


问题

何时会话结束?

用户角度:打开浏览器,从发起第一次请求开始,到关闭浏览器结束。

服务器:从第一次访问开始,到session失效时结束。
(session是有时效的,一些网站的10天免登录功能就是基于这个原理实现的)

当cookie被禁用后,session也将无法继续使用

当第一次发起请求,服务端作出响应后,携带sessionID的cookie会保存在浏览器的缓存中。如果将浏览器禁用了,当用户再次发起请求时,就不会再携带cookie了,服务端接收到请求后,没有获取到cookie,认为这是一个新的请求,就会再次创建一个session对象存入session列表中,以至于每次请求都会进行session的新建,原来的session就无法继续使用。

当客户端禁用cookie后,还能再进行会话追踪吗?

当然可以啊,cookie的本质就是在再一次发起请求时,将sessionID传输到服务端(类似快递小哥的作用),既然如此,我们可以在发起请求时手动添加sessionID。


总结

cookie VS session
共同点

都是辅助HTTP协议进行会话追踪的机制。

不同点

存放位置

  • cookie:浏览器的缓存中
  • session:服务器

安全性

  • cookie:不安全。cookie存储在本地,容易被窃取,从而进行cookie欺骗。
  • session:安全。存储在服务器中,需要通过sessionID到session列表中查找对应的session对象,因此比较安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值