Cookie的使用细节
Cookie的使用细节
Cookie 是浏览器端保存的一小段键值数据,随请求自动带回服务器(在 HTTP请求报文 的请求头里)。它常用于“会话标识/偏好设置/轻量状态”,并且经常与 Session 配合。
关联:Cookie / Cookie的原理 / 会话跟踪技术
- Cookie存活时间
- 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
- setMaxAge(int seconds): 设置Cookie存活时间
- 正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
- 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
- 零:删除对应Cookie
删除 Cookie 的关键点
删除并不是“服务端让浏览器删掉内存中的某个对象”,而是:下发一个同名 Cookie,并把 Max-Age=0(或过期时间设为过去)。
要删除成功,通常需要保证 name + domain + path 与原来一致,否则浏览器会把它当作“另一个 Cookie”。
- Cookie存储中文
- Cookie不能直接存储中文
- 如需要存储,则需要进行转码:URL编码
// AServlet.java
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 发送Cookie
String value = "张三";
// URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:" + value);
// 1. 创建Cookie对象
Cookie cookie = new Cookie("username", value);
// 设置存活时间 1周 7天
cookie.setMaxAge(60*60*24*7);
// 2. 发送cookie, response
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
// BServlet.java
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Cookie
// 1. 获取Cookie数组
Cookie[] cookies = req.getCookies();
// 2. 遍历数组
for (Cookie cookie : cookies) {
// 3. 获取数据
String name = cookie.getName();
if ("username".equals(name)) {
String value = cookie.getValue();
// URL解码
value = URLDecoder.decode(value, "UTF-8");
System.out.println(name + ":" + value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
安全与工程实践(常见但容易忽略)
- HttpOnly:阻止 JS 直接读取 Cookie,降低 XSS 盗取风险(适合会话标识类 Cookie)
- Secure:仅在 HTTPS 下发送 Cookie
- SameSite:限制跨站携带 Cookie,降低 CSRF 风险(需要结合业务跨站场景选择)
- 大小限制:单个 Cookie 与总量都有浏览器限制,别把大对象塞进 Cookie