会话的英文单词是session
用户打开浏览器,进行一系列操作,最后关闭浏览器,这是一次会话(一次会话对应n次请求)
会话在服务器端有一个对应的java对象,这个java对象叫做:session
在Servlet中,session对应的类名:HttpSession(jakarta.servlet.http.HttpSession)
session对象的主要作用:保存会话状态(用户登录成功,这是一种登录成功的状态,这需要session来保留会话状态)
保存会话状态的原因
HTTP是一种无状态协议
无状态 :请求的时候,B和S是连接的,但请求结束过后,连接就断开了(这样的瞬间连接与瞬间断开,会降低服务器的压力)
B和S断开了,那么关闭浏览器的这个动作,服务器知道吗?
不知道,服务器是不知道浏览器的关闭动作(这里指的是网页安全返回退回和直接关闭浏览器)
为什么不使用request保存session会话状态(生命周期很奇妙)
request无法保存session会话状态,因为request生命周期相较于太短
ServletContext对是服务器启动时创建,在服务器关闭时销毁
请求域(request)< 会话域(session)< 应用域(servletcontext)
session超时机制
当浏览器关闭时,服务器并不知晓,自然服务器端的session对象也并不会马上销毁,所以采用超时机制,在一定时间内没有对此session对象有请求时,才会被销毁
<!-- session超时30分钟后,会被销毁-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
获取session对象
HTTPSession session=request.getSession();[若当前session获取不到,则会新建一个对应的session]
HTTPSession session=request.getSession(false);[若当前session获取不到,则也不会新建,返回null]
Session的实现原理
在web服务器中有个session列表,类似map集合
这个map集合的key存储的时sessionID
这个map集合的value存储的是对应的session对象
当用户打开浏览器时,获取session对象时,会通过存储在浏览器上sessionID(浏览器上的缓存)查找服务器的session,若未找到,则在服务端中新建一个对应的session对象
sessionID是以cookie的形式保存在浏览器
若cookie禁用?
url重写机制:在原先url后面加上;jsession=...或者在后端代码地址后面编写动态地址
浏览器关闭后,会话结束
若关闭浏览器,则浏览器上的缓存会被清除,但session还存在,因为http是无状态协议,服务器是不知道浏览器已经被关闭了,同时呢,session对象也不会被销毁,而是通过服务器关闭或是通过session超时机制被销毁。
若浏览器安全退出,浏览器会向服务器发送一次请求,服务器收到请求,会立马销毁对应的session对象。
总结目前所学的域
请求域(request 对应类名:HttpServletRequest)(请求级别)
会话域(session 对应类名:HttpSession)(用户级别)
应用域(application 对应类名:ServletContext)(项目级别,所有用户共享的)
三个域的大小关系:request < session < application
三个域都有各自的公共方法:
setAttribute(向域当中绑定数据)
getAttribute(向域当中获取数据)
removeAttribute(删除域当中的数据)
使用原则:尽量使用小的域