概念:Session用来跟踪客户状态,将数据以键值对形式存放在服务端。
应用场景:当多个用户以同一个URL发出请求时,Session就用来标识是哪个用户发出的请求,以实现后续操作。
会话机制:Servlet容器(Tomcat)为每一个会话分配一个HttpSession对象,由Servlet容器管理。用户保留一个name为JSESSIONID的Cookie(Cookie是客户端保存信息的机制),在于服务端交互时,Servlet容器在HTTP请求头中自动查找这个Cookie,以找到与之对应的HttpSession对象或创建新的HttpSession对象,并在响应时在HTTP响应头中添加这个name为JSESSIONID的Cookie。(当Cookie被禁用时,使用URL重写机制,在URL后添加;jessionid=XXX以传输HttpSession对象标识)
Web应用生命周期:与ServletContext对象生命周期一致。可通过getServletContext()方法获取ServletContext对象。
会话生命周期:
1、创建:
一个浏览器进程第一次访问一个支持会话的网页就会创建新的HttpSession对象,并生成Cookie添加到响应中;
当会话被销毁后,浏览器进程再次访问一个支持会话的网页,因为Cookie依然存在,但对于HttpSession已经被销毁,所以重新创建 HttpSession对象;
2、使用:
getAttribute(String name)获取对应键值;
setAttribute(String name, Object value)设置键值;
3、销毁:
浏览器停止运行;
Session过期: setMaxInactiveInterval(int interval)设置Session失效时间;
服务端主动销毁:removeAttribute(String name)销毁HttpSession中的某一键值数据;
invalidate()销毁当前HttpSession对象;
注意:Tomcat的Web应用被终止时,会话不会被销毁,而是被Tomcat持久化到永久性存储器中。
会话的可持久化:将HttpSession对象从内存中转移到永久性设备(文件系统、数据库)中,以节约内存空间,与确保服务器重启或Web应用重启后,会 话信息依旧可用。要想实现持久化,涉及到的相关类必须实现java.io.Serializable接口。
会话管理器: org.apache.catalina.session.StandardManager标准会话管理器
——持久化文件SESSIONS.ser,可在META-INF/context.xml的<Context>元素下配置<Manager>元素以控制Session
org.apache.catalina.session.PersistenceManager持久化会话管理器
——需在配置<Manager>元素基础上配置<Store>元素
会话监听:
1、HttpSessionListener接口
通过sessionCreated(HttpSessionEvent event)监听HttpSession的创建,创建时调用;
通过sessionDestroyed(HttpSessionEvent event)监听HttpSession的销毁,销毁前调用;
2、HttpSessionAttributeListener接口
通过attributeAdded(HttpSessionBindingEvent event)监听添加属性;
通过attributeRemoved(HttpSessionBindingEvent event)监听删除属性;
通过attributeReplaced(HttpSessionBindingEvent event)监听修改属性值;
以上两种监听机制,需要在web.xml中注册:
<Listener>
<listener-class></listener-class>
</Listener>
3、HttpSessionBindingListener接口,监听会话与属性绑定或解除绑定事件
属性绑定是在HttpSession对象创建后,解除绑定是在HttpSession销毁前,可以实现在线人数的统计。
4、HttpSessionActivationListener接口,监听会话被激活与被搁置事件