Cookie 概述
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。
识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
要理解 Cookie,大家首先要明白 HTTP 协议是无状态的。就好比,你访问了一个网址,当你点下刷新第二次访问的时候,服务器不知道第二次的也是你,这就是无状态。那么解决办法就是:服务器给客户端发送一点点东西,然后客户端第二次再次访问服务器的时候,把这一点点东西发回给服务器,这样服务器就知道是谁了。
打开一个网页,通过浏览器开发者工具,可以查看到 Cookie。Cookie 大致包含 name、value、domain、path、expires 等。其中 name 就是键,value 对应的值,domain 对应的域名,path 是域名的路径,expires 可以配置 Cookie 的过期时间。
Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。expires 字段是一个指令,告诉浏览器在给定的时间和日期之后”忘记”该 Cookie。如果浏览器被配置为存储 Cookie,它将会保留此信息直到到期日期。如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。
Servlet Cookie 方法
| 序号 | 方法 | 说明 |
|---|---|---|
| 1 | public void setDomain(String pattern) | 设置 cookie 适用的域,例如 foxdevelop.com |
| 2 | public String getDomain() | 获取 cookie 适用的域 |
| 3 | public void setMaxAge(int expiry) | 设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效 |
| 4 | public int getMaxAge() | 返回 cookie 的最大生存周期(以秒为单位),默认情况下 -1 表示 cookie 将持续下去,直到浏览器关闭 |
| 5 | public String getName() | 返回 cookie 的名称。名称在创建后不能改变 |
| 6 | public void setValue(String newValue) | 设置与 cookie 关联的值 |
| 7 | public String getValue() | 获取与 cookie 关联的值 |
| 8 | public void setPath(String uri) | 设置 cookie 适用的路径。如果不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie |
| 9 | public String getPath() | 获取 cookie 适用的路径 |
| 10 | public void setSecure(boolean flag) | 设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送 |
| 11 | public void setComment(String purpose) | 设置 cookie 的注释,该注释在浏览器向用户呈现 cookie 时非常有用 |
| 12 | public String getComment() | 获取 cookie 的注释,如果 cookie 没有注释则返回 null |
创建 Cookie 对象
Cookie cookie = new Cookie("key", "value");Code language: JavaScript (javascript)
请记住,无论是名字还是值,都不应该包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
设置最大生存周期(以秒为单位):
cookie.setMaxAge(60 * 60 * 24);Code language: CSS (css)
发送 Cookie 到 HTTP 响应头,发给客户端:
response.addCookie(cookie);Code language: CSS (css)
完整代码示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append(request.getAttribute("data").toString());
Cookie cookie = new Cookie("key", "1");
cookie.setMaxAge(60 * 60 * 24); // 有效时间是一天
cookie.setDomain("www.foxdevelop.com");
cookie.setPath("/");
response.addCookie(cookie);
}Code language: JavaScript (javascript)
如果 Cookie 的值是中文,应该进行 URL 编码:
Cookie name = new Cookie("name", URLEncoder.encode("foxdevelop", "UTF-8")); // 中文转码Code language: JavaScript (javascript)
通过 Servlet 读取 Cookie
要读取 Cookie,需要通过调用 HttpServletRequest 的 getCookies() 方法创建一个 javax.servlet.http.Cookie 对象的数组:
Cookie[] cookies = request.getCookies(); // 数组Code language: JavaScript (javascript)
下面是读取 Cookie 的示例:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
System.out.println(cookies[0].getValue());
}
}Code language: JavaScript (javascript)