会话跟踪技术之Session
Session介绍
什么是Session?
- 背景:
HTTP
协议是无状态协议,无状态是指每次request请求之前是相互独立的,当前请求并不会记录它的上一次请求信息
- 问题:既然无状态,那么完成一整套业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同一个浏览器操作呢?
cookie
和session
都是为了弥补http
协议的无状态特性,对server
端来说无法知道两次http
请求是否来自同一个用户,利用cookie
和session
就可以让server
端知道多次http
请求是否来自同一用户
生成和使用流程(和Cookie
知识点一样)
- 浏览器第一次发送
request
请求到服务器,服务器除了返回请求的response
之外,还给请求分配一个唯一标识sessionId
同response
一并返回给浏览器
- 服务器在本地创建一个
map
结构,专门以key-value
存储这个sessionId
和浏览器的关系
- 浏览器的第一次请求后已经分配一个
sessionId
,当第二次访问时会带上sessionId
- ⚠️
sessionId
是有时限性的,比如如果30分钟内某个sessionId
都没有被更新,服务器就会删除它
总结
- 服务器生成这个全局唯一标识,传递给客户端用于标记这次请求(即
cookie
)
- 服务器创建的那个
map
结构就是session
cookies
由服务器生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送
session
服务端自己维护的一个map
数据结构,记录key-Object
上下文内容状态
- 总而言之,
cookie
是保存在客户端,session
是存在服务端,session
依赖于cookie
cookie
里面存储的就是JSESSIONID
使用场景
session现状
session
是存储在服务端的内存中,在Java web
里面叫HttpSession
,也是一个作用域
PageContext
(页面)->ServletRequest
(请求)->【HttpSession
】(会话)->ServletContext
(一个应用)
- 是可以存储很多
key-value
的,作用域比较广,但是也不能存储过多的内容,因为内存是有限制的。互联网企业使用的比较少,传统IT公司使用比较多
知识延伸
- 服务端是单机情况下
session
是可以使用的,但是分布式(多台机器)情况下就存在session
不能共享的问题
- 用户A在当前机器登录,突然某次请求到B机器,由于B服务不存在这个用户的登录信息,所以就会提示重新登录
- 这个场景下就用到分布式存储方案,比如
Redis