Java Web Cookie

本文将介绍在 Java Web 中如何使用和操作 Cookie。

一、Cookie

具体请看:

前后端分离 Cookie

二、Cookie 方法

方法 说明
Cookie Cookie(String name, String value) 新建指定名称和值的 cookie
void setDomain(String pattern) 设置 cookie 适用的域
String getDomain() 获取 cookie 适用的域
setMaxAge(int time) 设置 cookie 过期的时间(以秒为单位)
int getMaxAge() 获取 cookie 过期的时间(以秒为单位)
String getName() 获取 cookie 的名称
setValue(String newValue) 设置 cookie 的值
String getValue() 获取 cookie 的值
void setPath(String uri) 设置 cookie 的获取范围
String getPath() 获取 cookie 的获取范围
void setSecure(boolean flag) 设置 cookie 是否应该只在加密连接上发送
void setComment(String purpose) 设置 cookie 的注释
String getComment() 获取 cookie 的注释
  • 创建 Cookie 对象

    1
    Cookie cookie = new Cookie(String name, String value)
  • 发送 Cookie 对象

    1
    response.addCookie(cookie);
1
Cookie[] cookies = request.getCookies()

获取请求头中包含的所有 cookie 组成的数组。

四、保存时长

  • 默认情况下,关闭浏览器后,cookie 立刻被销毁

  • 可以通过 setMaxAge(int time) 设置 cookie 过期的时间,其中:

    • 正数:将 cookie 持久化保存,保存时长为 time 秒
    • 零:立刻删除 cookie 信息
    • 负数:默认,关闭浏览器后 cookie 立刻被销毁

五、获取范围

1. setPath()

可以通过 setPath(String uri) 方法设置 cookie 的获取范围。

2. 项目中的指定路径

实现方法:

setPath("/项目路径/访问路径")

说明:

cookie 将会且仅会在发送至 /项目路径/访问路径/··· 的请求中附带。

假设 setPath("/project1/home"),则:

  • 发送至 /project2/home 的请求不会附带该 cookie
  • 发送至 /project2/a/home 的请求不会附带该 cookie
  • 发送至 /project1/home 的请求附带该 cookie
  • 发送至 /project1/home/uesr 的请求附带该 cookie

3. 同一个项目

实现方法:

  • 默认情况下,Cookie 的获取范围为当前项目
  • setPath("/项目路径")

说明:

项目下的 cookie 可以共享,cookie 将会被附带至发送到项目的所有请求中。

CookieServlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 Cookie 对象
Cookie cookie = new Cookie("message", "Hello");
// 默认情况下,Cookie 的获取范围为当前项目
cookie.setPath("/66_Cookie_war_exploded");
// 发送 Cookie
response.addCookie(cookie);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

CookieServlet2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@WebServlet("/CookieServlet2")
public class CookieServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + "|" + cookie.getValue());
}
}
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

结果:

在首次访问 CookieServlet,存储 cookie 之后,

向 CookieServlet 发送的请求和向 CookieServlet2 发送的请求的请求头中都会包含 message = Hello 的 cookie 。

4. 同一个服务器下的不同项目

实现方法:

setPath("/")

说明:

cookie 将会附带至发送到服务器的所有请求中。

CookieServlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 Cookie 对象
Cookie cookie = new Cookie("message", "Hello");
// 设置 Cookie 的获取范围为整个服务器
cookie.setPath("/");
// 发送 Cookie
response.addCookie(cookie);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

结果:

发送至同一个服务器下不同项目的请求均附带了该 cookie。

5. 不同服务器

可以通过 setDomain(String pattern) 方法设置 cookie 适用的域,设置后发送同一个域名的请求将会附带该 cookie。

pattern 的格式为 “.XXX.XXX”

“.baidu.com”

参考