Servlet Cookie 处理

Cookie 概述

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。

识别返回用户包括三个步骤:

  1. 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
  2. 浏览器将这些信息存储在本地计算机上,以备将来使用。
  3. 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。

要理解 Cookie,大家首先要明白 HTTP 协议是无状态的。就好比,你访问了一个网址,当你点下刷新第二次访问的时候,服务器不知道第二次的也是你,这就是无状态。那么解决办法就是:服务器给客户端发送一点点东西,然后客户端第二次再次访问服务器的时候,把这一点点东西发回给服务器,这样服务器就知道是谁了。

打开一个网页,通过浏览器开发者工具,可以查看到 Cookie。Cookie 大致包含 namevaluedomainpathexpires 等。其中 name 就是键,value 对应的值,domain 对应的域名,path 是域名的路径,expires 可以配置 Cookie 的过期时间。

Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。expires 字段是一个指令,告诉浏览器在给定的时间和日期之后”忘记”该 Cookie。如果浏览器被配置为存储 Cookie,它将会保留此信息直到到期日期。如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。

Servlet Cookie 方法

序号方法说明
1public void setDomain(String pattern)设置 cookie 适用的域,例如 foxdevelop.com
2public String getDomain()获取 cookie 适用的域
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

创建 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,需要通过调用 HttpServletRequestgetCookies() 方法创建一个 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注