Java Cookie 读写操作案例
创建 Cookie(写入)
服务端创建 Cookie
// 创建Cookie
Cookie cookie = new Cookie("username", "张三");
// 设置Cookie有效期(单位:秒),7天
cookie.setMaxAge(7 * 24 * 60 * 60);
// 设置路径,根目录下所有URL都可用
cookie.setPath("/");
// 设置域名(可选)
cookie.setDomain(".example.com");
// 设置HTTP Only,防止JavaScript访问
cookie.setHttpOnly(true);
// 设置安全标志(仅HTTPS传输)
cookie.setSecure(true);
// 将Cookie添加到响应中
response.addCookie(cookie);
// 创建多个Cookie
Cookie cookie2 = new Cookie("userid", "1001");
cookie2.setMaxAge(3600); // 1小时
cookie2.setPath("/");
response.addCookie(cookie2);
JavaScript 创建 Cookie(客户端)
// 创建Cookie,默认会话结束时过期 document.cookie = "username=张三"; // 设置过期时间(7天后) let date = new Date(); date.setTime(date.getTime() + 7 * 24 * 60 * 60 * 1000); document.cookie = "username=张三; expires=" + date.toUTCString(); // 设置路径和域名 document.cookie = "username=张三; path=/; domain=.example.com"; // 设置Secure和SameSite document.cookie = "username=张三; Secure; SameSite=Strict";
读取 Cookie
服务端读取 Cookie
// 获取所有Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
int maxAge = cookie.getMaxAge();
String path = cookie.getPath();
String domain = cookie.getDomain();
boolean secure = cookie.getSecure();
System.out.println("Cookie名称: " + name);
System.out.println("Cookie值: " + value);
System.out.println("有效期: " + maxAge + "秒");
System.out.println("路径: " + path);
System.out.println("------------------------");
// 获取特定Cookie
if ("username".equals(name)) {
String username = value;
// 处理业务逻辑
}
}
} else {
System.out.println("没有找到任何Cookie");
}
使用工具方法读取特定 Cookie
public class CookieUtil {
/**
* 根据名称获取Cookie值
*/
public static String getCookieValue(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookieName.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}
/**
* 获取所有Cookie的Map集合
*/
public static Map<String, String> getAllCookies(HttpServletRequest request) {
Map<String, String> cookieMap = new HashMap<>();
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
cookieMap.put(cookie.getName(), cookie.getValue());
}
}
return cookieMap;
}
}
// 使用示例
String username = CookieUtil.getCookieValue(request, "username");
Map<String, String> allCookies = CookieUtil.getAllCookies(request);
JavaScript 读取 Cookie
// 获取所有Cookie
console.log(document.cookie);
// 获取特定Cookie值
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
// 使用示例
let username = getCookie('username');
console.log(username); // 输出:张三
修改 Cookie
服务端修改
// 获取现有Cookie并修改
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
// 修改值
cookie.setValue("李四");
// 修改其他属性
cookie.setMaxAge(7 * 24 * 60 * 60); // 重置有效期
cookie.setPath("/");
// 将修改后的Cookie添加到响应
response.addCookie(cookie);
break;
}
}
}
JavaScript 修改
// 修改Cookie直接覆盖即可 document.cookie = "username=李四; path=/; max-age=" + (7 * 24 * 60 * 60);
删除 Cookie
服务端删除
// 方法1:设置MaxAge为0
Cookie cookie = new Cookie("username", null);
cookie.setMaxAge(0); // 立即过期
cookie.setPath("/"); // 路径必须与创建时一致
response.addCookie(cookie);
// 方法2:设置MaxAge为负数(会话结束时删除)
Cookie cookie2 = new Cookie("userid", null);
cookie2.setMaxAge(-1);
cookie2.setPath("/");
response.addCookie(cookie2);
JavaScript 删除
// 设置过期时间为过去的时间 document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/"; // 或者设置max-age为0 document.cookie = "username=; max-age=0; path=/";
完整示例:登录状态管理
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String remember = request.getParameter("remember");
// 创建登录Cookie
Cookie loginCookie = new Cookie("loginUser", username);
loginCookie.setPath("/");
loginCookie.setHttpOnly(true);
if ("on".equals(remember)) {
// 记住我:有效期7天
loginCookie.setMaxAge(7 * 24 * 60 * 60);
} else {
// 不记住:会话结束时删除
loginCookie.setMaxAge(-1);
}
response.addCookie(loginCookie);
response.sendRedirect("home.jsp");
}
}
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 删除登录Cookie
Cookie cookie = new Cookie("loginUser", "");
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
response.sendRedirect("login.jsp");
}
}
注意事项
-
编码问题:Cookie值不能包含空格、分号、逗号等特殊字符,建议进行URL编码

String encodedValue = URLEncoder.encode("张三", "UTF-8"); Cookie cookie = new Cookie("username", encodedValue); // 读取时解码 String decodedValue = URLDecoder.decode(cookie.getValue(), "UTF-8"); -
安全考虑:
- 敏感信息不要存储在Cookie中
- 设置HttpOnly防止XSS攻击
- 使用Secure确保HTTPS传输
- 设置合适的Path和Domain范围
-
大小限制:单个Cookie大小不超过4KB,每个域名下Cookie总数不超过20个
-
浏览器兼容性:不同浏览器对Cookie的支持有差异,注意测试