Contents

Cookie & HttpSession

  • 完成会话跟踪的一种机制: 采用的是在客户端保持 HTTP 状态信息的方案
  • Cookie是在浏览器访问 WEB 服务器的某个资源时,由 WEB 服务器在 HTTP 响应消息头中附带传送给浏览器的一个小文本文件
  • 一旦 WEB 浏览器保存了某个Cookie,那么它在以后每次访问该 WEB 服务器时,都会在 HTTP 请求头中将这个 Cookie 回传给 WEB 服务器

cookie.png

1
2
3
4
5
6
7
8
9
//1. 创建一个Cookie对象
Cookie cookie = new Cookie("name", "ang");
//2. setMaxAge: 设置Cookie 的最大时效,以秒为单位,若为0,表示立即删除该Cookie
// 若为负数,表示不存储改Cookie
cookie.setMaxAge(30);
//3. 设置Cookie的作用范围
cookie.setPath(request.getContextPath())
//4. 调用response 的一个方法把Cookie传给客户端
response.addCookie(cookie);
1
2
3
4
5
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
    for (Cookie cookie: cookies)
        out.print(cookie.getName() + ": " + cookie.getValue());
}
  • 如果不设置过期时间,则表示这个 cookie 生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这种生命期为浏览器会话期的 cookie 被称为会话 cookie。会话 cookie 一般不保存在硬盘上而是保存在内存里.
  • 如果设置了过期时间,浏览器就会把 cookie 保存到硬盘上,关闭后再次打开浏览器,这些 cookie 依然有效直到超过设定的过期时间

HttpSession

  • 在服务器端保持 HTTP 状态信息的方案
  • 产生Session对象的过程: 当程序需要为某个客户端的请求创建一个 session 时,服务器首先检查这个客户端的请求里是否包含了一个 session 标识(即 sessionId),如果已经包含一个 sessionId 则说明以前已经为此客户创建过 session,服务器就按照 session id 把这个 session 检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的 session 对象,但用户人为地在请求的 URL 后面附加上一个 JSESSION 的参数)。如果客户请求不包含 sessionId,则为此客户创建一个 session 并且生成一个与此 session 相关联的 sessionId,这个 session id 将在本次响应中返回给客户端保存。
  • 使用Cookie来跟踪 Session: session 通过 SessionID 来区分不同的客户, session 是以 cookie 或 URL 重写为基础的,默认使用 cookie 来实现,系统会创造一个名为 JSESSIONID 的输出 cookie,这称之为 session cookie,以区别 persistent cookies(也就是我们通常所说的 cookie),session cookie 是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到 JSESSIONID,但是当把浏览器的 cookie 禁止后,web 服务器会采用 URL 重写的方式传递

HttpSession 的生命周期

  • 创建一个 HttpSession 对象 一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet)调用 HttpServletRequest.getSession(true) 或者 HttpServletRequest.getSession()这样的语句时才会被创建
  • 销毁 HttpSession 对象
    1. 程序调用 HttpSession.invalidate()
    2. 距离上一次收到客户端发送的 session id 时间间隔超过了 session 的最大有效时间
    3. 服务器进程被停止(或当前 Web 应用被卸载) 注意:关闭浏览器只会使存储在客户端浏览器内存中的 session cookie 失效,不会使服务器端的 session 对象失效。

HttpSession 相关的 API

  • 获取Session对象 request.getSession(), request.getSession(boolean create)
  • 属性相关的: setAttribute, getAttribute, removeAttribute
  • 使 Session 失效:invalidate()
  • 设置其最大失效时间: setMaxInactiveInterval

URL 重写

Servlet 规范中引入了一种补充的会话管理机制,它允许不支持 Cookie 的浏览器也可以与 WEB 服务器保持连续的会话。 将会话标识号以参数形式附加在超链接的 URL 地址后面的技术称为 URL 重写。 代码:

1
<a href="<%= response.encodeURL("login.jsp") %>"login</a>