共同点
都是会话跟踪技术
在聊区别之前,我们先来看看它们的由来
HTTP协议
Hyper Text Transfer Protocol 超文本传输协议
特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
由于HTTP是无状态的协议,自身不对请求和响应之间的通信状态进行保存,意味着如果后续的处理工作需要前面的信息,则必须重传。为解决这个问题,引入了cookie和session机制,进行会话追踪。
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对象,因此比较安全。