Java Web Cookie
本文将介绍在 Java Web 中如何使用和操作 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 的注释 |
三、Servlet 中的 Cookie
1. 发送 Cookie
创建 Cookie 对象
1
Cookie cookie = new Cookie(String name, String value)
发送 Cookie 对象
1
response.addCookie(cookie);
2. 接收 Cookie
1 |
|
获取请求头中包含的所有 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”