Servlet 会话

在网络的七层模型中,会话层位于传输层之上,它定义如何开始、控制和结束一个会话。七层模式目前仅仅处于理论阶段,但是Web中借鉴了其中的一些思路。在Web中浏览器第一次发送请求到服务器开始直到一方断开为止算作一个会话。HTTP协议本身没有状态,那么Web服务如何知道这次请求是否在一个会话中呢?Web提供了Cookie和Session两种技术。

服务器在第一次收到请求之后,会在HTTP响应头的Set-Cookie中,设置Cookie值,浏览器收到响应后,保存这个Cookie在本地。后续再进行请求的时候在HTTP的请求头中设置Cookie值,服务器根据此Cookie来识别请求的状态。

Cookie值本身是一个键值对,例如 Cookie: name=value;

Servlet 使用Cookie

在Servlet中,使用Cookie的步骤如下:

  1. 创建Cookie对象 new Cookie(String name, String value)
  2. 发送cookie到浏览器 response.addCookie(Cookie)
  3. 获取浏览器中发送过来的cookie request.getCookies() 返回所有Cookie
  4. 遍历Cookies 获取所有cookie对象
  5. 调用Cookie.getName(), Cookie.getValue()获取Cookie中的键和值

使用的注意事项如下:

  1. 一次可以返回多个Cookie,多次调用response.addCookie即可
  2. 默认情况下浏览器关闭页面后cookie失效,但是可以设置cookie失效时间

Cookie虽然可以用来识别一次会话,但是也不能滥用,第一Cookie是存储在浏览器端的,可以被伪造,一般做过爬虫自动登录的都这样干过,第二浏览器对于单个cookie大小有限制,一般是4kb。同时浏览器对于单个域名的cookie也有限制,默认是20个。由于cookie本身是类似于小饼干的小料,一般来说不会把小料作为主菜。

Session

Cookie一般作为小料,作为会话标识来说,用Session更为常见。

与 Cookie相比Session存储在服务器端,Session没有cookie的那些限制。

实现原理

Session的实现是基于Cookie的。

  1. 第一次调用request.getSession获取Session,没有Cookie 会在内存中创建一个新的Cookie对象,名称为JSESSION值是一个唯一的ID,作为session的唯一标识
  2. 在给客户端响应时会包含一个cookie值,Set-Cookie: JSESSION=ID
  3. 浏览器在下一次访问web中的其他资源时会将cookie作为请求头发送到服务器。
  4. 服务器会从cookie中取出ID值,并根据ID从内存中查找对应的Session对象

使用 HttpSession session = request.getSession(); 来获取一个Session对象

函数列表

Session 对象常用函数如下:

1
2
3
4
5
6
7
8
9
10
11
public Object getAttribute(String name); //该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
public 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 会话,则该方法返回 true。
public void removeAttribute(String name); //该方法将从该 session 会话移除指定名称的对象。
public void setAttribute(String name, Object value); //该方法使用指定的名称绑定一个对象到该 session 会话。
public void setMaxInactiveInterval(int interval); //该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。