HttpSession详解
Session可以做什么
- 网上商城中的购物车
- 保存登录用户的信息
- 将数据放入到 Session 中,供用户在访问不同页面时,实现跨页面访问数据
- 防止用户非法登录到某个页面
详解
HttpSession
是Java Servlet API中用于管理用户会话的核心组件,它允许Web应用程序在服务器端存储和检索与单个用户相关的状态信息。以下是关于HttpSession的详细解释:
-
作用与目的:
- HttpSession主要用于解决HTTP协议的无状态特性问题,即服务器无法区分两次不同请求是否来自于同一用户。通过引入HttpSession,服务器可以在用户的一系列请求之间维持状态信息。
-
创建与标识:
- 当一个新用户首次访问Web应用时,如果需要启动会话,则服务器会在接收到请求后创建一个新的HttpSession实例,并为其生成一个唯一的会话ID(SessionID)。
- SessionID通常以Cookie的形式发送回客户端,客户端后续的请求会携带这个SessionID,服务器依据SessionID识别出属于同一个用户的多个请求之间的关联性。
-
存储与管理:
- HttpSession对象存储在服务器端,可以存放任意类型的对象属性,开发者可以通过
setAttribute()
方法将数据放入会话,然后通过getAttribute()
方法从会话中获取数据。 - Web容器(如Tomcat、Jetty等)内部会维护一个“session列表”,即session池,用于管理所有活跃的HttpSession实例。
- HttpSession对象存储在服务器端,可以存放任意类型的对象属性,开发者可以通过
-
生命周期:
- 会话的生命周期始于创建并分配SessionID之时,结束于以下几种情况之一:
- 开发者明确调用
invalidate()
方法销毁会话。 - 用户关闭浏览器(实际取决于浏览器的行为,有些情况下不关闭也会因为超时而失效)。
- 服务器配置的会话超时时间到达,会自动清除未活动的会话。
- 服务器关闭或者重启(对于非持久化的会话数据来说,这些数据将会丢失)。
- 开发者明确调用
- 会话的生命周期始于创建并分配SessionID之时,结束于以下几种情况之一:
-
获取会话:
- 在Servlet中,可以通过HttpServletRequest对象的方法获取HttpSession:
HttpSession session = request.getSession(); // 如果不存在则创建新的会话 HttpSession session = request.getSession(true); // 同上,布尔参数true表示如果没有就创建 HttpSession session = request.getSession(false); // 如果不存在则返回null
- 在Servlet中,可以通过HttpServletRequest对象的方法获取HttpSession:
-
安全性:
- SessionID的安全性很重要,因此许多Web容器会对SessionID进行加密处理,以防被篡改或恶意利用。
- 为了提高安全性,还可以配置HttpSession的超时时间以及使用HTTPS来传输SessionID,防止在网络中被窃听。
-
跨域共享:
- 默认情况下,HttpSession是在单一Web应用程序的上下文中有效的。但在集群环境中,为了使多个服务器节点间能够共享会话,需要采取分布式缓存或其他方式同步Session信息。