Request 对象解决了一次请求内的不同 Servlet 的数据共享问题,而对于一个用户的不同请求的处理需要使用相同的数据时我们需要使用session 技术。
原理
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象。
特点
- Session 技术是依赖Cookie 技术的服务器端的数据存储技术
- 由服务器进行创建
- 每个用户独立拥有一个session
- 默认存储时间为 30 分钟
- 解决了一个用户的不同请求的数据共享问题
使用
- 创建 Session 对象
- 存储数据到 session 对象,再次访问时获取 session 对象
- 从 session 对象获取数据
- 如果获取 session 中不存在的数据返回null。
- 作用域:一次会话
只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意 Servlet 中获取到的都是同一个session 对象。
Servlet Session
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
- Cookies
- 隐藏的表单字段
- URL 重写
HttpSession 对象
除了上述的三种方式,Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
通过调用 HttpSession session = request.getSession();
来获取 HttpSession 对象。你需要在向客户端发送任何文档内容之前调用 request.getSession()。
HttpSession 对象中可用的几个重要的方法:
public Object getAttribute(String name)
: 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 nullpublic Enumeration getAttributeNames()
: 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称public long getCreationTime()
: 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位public String getId()
: 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串public long getLastAccessedTime()
: 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位public int getMaxInactiveInterval()
: 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位public void invalidate()
: 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象public boolean isNew()
: 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 truepublic void removeAttribute(String name)
: 该方法将从该 session 会话移除指定名称的对象public void setAttribute(String name, Object value)
: 该方法使用指定的名称绑定一个对象到该 session 会话public void setMaxInactiveInterval(int interval)
: 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位
删除 Session 会话数据
- 移除一个特定的属性:您可以调用
public void removeAttribute(String name)
方法来删除与特定的键相关联的值 - 删除整个 session 会话:您可以调用
public void invalidate()
方法来丢弃整个 session 会话 - 设置 session 会话过期时间:您可以调用
public void setMaxInactiveInterval(int interval)
方法来单独设置 session 会话超时
web.xml 配置
使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,下面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间。如下所示:
<session-config> <session-timeout>15</session-timeout> </session-config>