跳至主要內容

7.会话管理

Harry Xiong大约 6 分钟Web 后台ServletMVCJSPJDBC

会话管理

以下是在 Servlet 中操作 Cookie 时可使用的有用的方法列表。

序号方法 & 描述
1public void setDomain(String pattern) 该方法设置 cookie 适用的域,例如 runoob.com。
2public String getDomain() 该方法获取 cookie 适用的域,例如 runoob.com。
3public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue) 该方法设置与 cookie 关联的值。
7public String getValue() 该方法获取与 cookie 关联的值。
8public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath() 该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag) 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose) 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment() 获取 cookie 的注释,如果 cookie 没有注释则返回 null。

通过 Servlet 设置 Cookie 包括三个步骤:

**(1) 创建一个 Cookie 对象:**您可以调用带有 cookie 名称和 cookie 值的 Cookie 构造函数,cookie 名称和 cookie 值都是字符串。

Cookie cookie = new Cookie("key","value");

请记住,无论是名字还是值,都不应该包含空格或以下任何字符:

[ ] ( ) = , " / ? @ : ;

**(2) 设置最大生存周期:**您可以使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。下面将设置一个最长有效期为 24 小时的 cookie。

cookie.setMaxAge(60*60*24);

**(3) 发送 Cookie 到 HTTP 响应头:**您可以使用 response.addCookie 来添加 HTTP 响应头中的 Cookie,如下所示:

response.addCookie(cookie);

要读取 Cookie,您需要通过调用 HttpServletRequestgetCookies() 方法创建一个 javax.servlet.http.Cookie对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

一般通过循环来遍历cookie

if (cookies != null) {
    for (Cookie cookie : cookies) {
    	// cookie的名字
    	cookie.getName();
    	// cookie的值
    	cookie.getValue();
    }
}

删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
  • 把这个 cookie 添加到响应头。

7.2 Session

7.2.1 Seeion对象及其主要方法

Servlet 提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

您会通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:

HttpSession session = request.getSession();

你需要在向客户端发送任何文档内容之前调用 request.getSession()。下面总结了 HttpSession 对象中可用的几个重要的方法:

序号方法 & 描述
1public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。
11public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

7.2.2 创建或读取Session会话

// 有则返回有的,没有则创建新的
HttpSession session = request.getSession();

// 读取Session保存一个名为code的数据值
String correctCode = (String)session.getAttribute("code");

// 给Session设置一个名为loginUser的数据值,值为userName
session.setAttribute("loginUser",userName);

7.2.3 删除 Session 会话数据

当您完成了一个用户的 session 会话数据,您有以下几种选择:

  • **移除一个特定的属性:**您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。
  • **删除整个 session 会话:**您可以调用 public void invalidate() 方法来丢弃整个 session 会话。
  • **设置 session 会话过期时间:**您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。
  • **注销用户:**如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。
  • **web.xml 配置:**如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,如下所示:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

上面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间。

在一个 Servlet 中的 getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900。