作用与目的:

HttpSession主要用于解决HTTP协议的无状态特性问题,即服务器无法区分两次不同请求是否来自于同一用户。通过引入HttpSession,服务器可以在用户的一系列请求之间维持状态信息。

创建与标识:

当一个新用户首次访问Web应用时,如果需要启动会话,则服务器会在接收到请求后创建一个新的HttpSession实例,并为其生成一个唯一的会话ID(SessionID)。

SessionID通常以Cookie的形式发送回客户端,客户端后续的请求会携带这个SessionID,服务器依据SessionID识别出属于同一个用户的多个请求之间的关联性。

存储与管理:

HttpSession对象存储在服务器端,可以存放任意类型的对象属性,开发者可以通过setAttribute()方法将数据放入会话,然后通过getAttribute()方法从会话中获取数据。

Web容器(如Tomcat、Jetty等)内部会维护一个“session列表”,即session池,用于管理所有活跃的HttpSession实例。

生命周期:

会话的生命周期始于创建并分配SessionID之时,结束于以下几种情况之一:

开发者明确调用invalidate()方法销毁会话。

用户关闭浏览器(实际取决于浏览器的行为,有些情况下不关闭也会因为超时而失效)。

服务器配置的会话超时时间到达,会自动清除未活动的会话。

服务器关闭或者重启(对于非持久化的会话数据来说,这些数据将会丢失)。

获取会话:

在Servlet中,可以通过HttpServletRequest对象的方法获取HttpSession:HttpSession session = request.getSession(); // 如果不存在则创建新的会话

HttpSession session = request.getSession(true); // 同上,布尔参数true表示如果没有就创建

HttpSession session = request.getSession(false); // 如果不存在则返回null

安全性:

SessionID的安全性很重要,因此许多Web容器会对SessionID进行加密处理,以防被篡改或恶意利用。

为了提高安全性,还可以配置HttpSession的超时时间以及使用HTTPS来传输SessionID,防止在网络中被窃听。

跨域共享:

默认情况下,HttpSession是在单一Web应用程序的上下文中有效的。但在集群环境中,为了使多个服务器节点间能够共享会话,需要采取分布式缓存或其他方式同步Session信息。