HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
本质上,一个Cookie就是一个key-value对,键称为name,值称为value。注意,一个Cookie只能有一对key-value对,这和HashMap并不一样。
以下是一段程序展示Cookie的使用方法。现在我们设计一个Cookie,其name为lastLoginTime,其value为用户访问网站的时间戳。在用户首次访问网站时,浏览器并没有该网站的Cookie,所以在浏览器发给服务器的请求中并不包含lastLoginTime这个Cookie。在服务器给浏览器的响应中,第一次添加了lastLoginTime这个Cookie,并且值就是这一次访问的时间戳。如果用户刷新网页,则在此次请求中就包含了那个Cookie,而后服务器更新lastLoginTime这个Cookie的值为新的访问时间戳。
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean hasLoginHistory = false;
PrintWriter out = resp.getWriter();
// 从请求中获取cookie,注意一个请求里可能有多个cookie,所以返回值是一个数组
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// 通过getName()获取cookie的名字
if (cookie.getName().equals("lastLoginTime")) {
hasLoginHistory = true;
// 通过getValue()获取cookie的值
Date lastLoginTime = new Date(Long.parseLong(cookie.getValue()));
out.println("The time you login last time: " + lastLoginTime.toString());
}
}
if (!hasLoginHistory) {
out.println("This is your first time to login.");
}
// 新建一个cookie,在构造函数中设置它的name和value
Cookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis()));
// 将新建的cookie添加到响应里
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
以下为运行效果:
用户第一次访问网站,请求中并没有lastLoginTime这个Cookie,而返回的响应头中Set-Cookie就是告诉浏览器要添加这个Cookie。
用户刷新网页,则请求中已经有了之前响应返回设置的Cookie了,而新的响应又给出了新的Cookie值。
最后总结一下在Java中操纵Cookie的一些方法:
1. 获取请求头中的所有Cookie(可能有多个)
Cookie[] cookies = req.getCookies();
2. 获取Cookie的名字
cookie.getName()
3. 获取Cookie的值
cookie.getValue()
4. 新建一个cookie,在构造函数中设置它的name和value
Cookie cookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
5. 将Cookie添加到响应里
resp.addCookie(cookie);
6. 设置Cookie的有效期
cookie.setMaxAge(EXPIRY);
其中,EXPIRY指代Cookie的有效期长度(以秒计)。若EXPIRY设置为0,则实际上表示该Cookie从浏览器上被删除。