Java案例如何读写Cookie数据?

wen java案例 22

本文目录导读:

Java案例如何读写Cookie数据?

  1. 写入 Cookie(服务端发送给客户端)
  2. 读取 Cookie(服务端从客户端请求中获取)
  3. 删除 Cookie
  4. 完整测试流程(使用浏览器或 Postman)
  5. 重要注意事项
  6. 中文值编码示例(避免乱码)

在 Java Web 开发中,Cookie 是用于在客户端(浏览器)存储少量数据的机制,通常通过 javax.servlet.http.Cookie 类和 HttpServletRequest/HttpServletResponse 对象进行操作。

以下是一个完整的 Java Servlet 案例,演示如何写入读取 Cookie 数据。


写入 Cookie(服务端发送给客户端)

步骤:

  1. 创建 Cookie 对象(键值对)。
  2. 设置属性(过期时间、路径、域名等)。
  3. 通过 response.addCookie() 发送给浏览器。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/writeCookie")
public class WriteCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        // 1. 创建 Cookie 对象 (键: username, 值: Jack)
        Cookie usernameCookie = new Cookie("username", "Jack");
        // 2. 设置 Cookie 的有效期(单位:秒)
        //    正数:过期时间(秒),负数:仅本次会话有效,0:立即删除
        usernameCookie.setMaxAge(60 * 60);  // 1小时后过期
        // 3. 设置 Cookie 的访问路径(可选,默认是当前应用的根路径)
        //    只有访问该路径下的资源时才会携带此 Cookie
        usernameCookie.setPath("/");
        // 4. 设置域名(可选,用于跨子域共享 Cookie)
        //    usernameCookie.setDomain(".example.com");
        // 5. 设置 HttpOnly(防止 XSS 攻击时被 JS 读取,增强安全性)
        usernameCookie.setHttpOnly(true);
        // 6. 将 Cookie 添加到响应中
        resp.addCookie(usernameCookie);
        // 7. 给客户端返回提示
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("Cookie 已写入!");
    }
}

读取 Cookie(服务端从客户端请求中获取)

步骤:

  1. 通过 request.getCookies() 获取所有 Cookie 数组。
  2. 遍历数组,根据名称查找目标 Cookie。
  3. 使用 cookie.getValue() 获取值。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/readCookie")
public class ReadCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String username = null;
        // 1. 获取请求中携带的所有 Cookie
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            // 2. 遍历 Cookie 数组,查找名为 "username" 的 Cookie
            for (Cookie cookie : cookies) {
                if ("username".equals(cookie.getName())) {
                    username = cookie.getValue();
                    break;  // 找到后退出循环
                }
            }
        }
        // 3. 根据结果返回响应
        resp.setContentType("text/html;charset=UTF-8");
        if (username != null) {
            resp.getWriter().write("读取到的 username: " + username);
        } else {
            resp.getWriter().write("未找到 username Cookie(可能已过期或未设置)");
        }
    }
}

删除 Cookie

删除 Cookie 通常通过设置 MaxAge0 来实现(注意路径必须与设置时一致):

Cookie deleteCookie = new Cookie("username", "");
deleteCookie.setMaxAge(0);        // 立即过期
deleteCookie.setPath("/");        // 路径必须与写入时相同
resp.addCookie(deleteCookie);

完整测试流程(使用浏览器或 Postman)

  1. 访问写入接口
    浏览器访问:http://localhost:8080/你的项目名/writeCookie
    服务端发送一个名为 username、值为 Jack、有效期1小时的 Cookie。

  2. 访问读取接口
    浏览器访问:http://localhost:8080/你的项目名/readCookie
    服务端从请求中解析 Cookie,输出 读取到的 username: Jack


重要注意事项

要点 说明
大小限制 单个 Cookie 不超过 4KB,每个域名下最多约 50 个 Cookie。
安全敏感数据 不要存放密码、Token 等敏感信息(除非使用 HTTPS + Secure 标记)。
编码问题 如果值包含中文或特殊字符,建议使用 URLEncoder.encode() / URLDecoder.decode() 进行编码/解码。
HttpOnly 设置为 true 可防止 JavaScript 通过 document.cookie 读取,降低 XSS 攻击风险。
跨域问题 默认情况下,Cookie 不会跨域传递,需设置 DomainSameSite 属性。

中文值编码示例(避免乱码)

// 写入时编码
String chineseValue = "张三";
Cookie cookie = new Cookie("username", URLEncoder.encode(chineseValue, "UTF-8"));
cookie.setMaxAge(3600);
resp.addCookie(cookie);
// 读取时解码
Cookie[] cookies = req.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) {
        if ("username".equals(c.getName())) {
            String decodedValue = URLDecoder.decode(c.getValue(), "UTF-8");
            // 使用 decodedValue
        }
    }
}

  • 写入new Cookie(键, 值)setMaxAge()response.addCookie()
  • 读取request.getCookies() → 遍历匹配 → cookie.getValue()
  • 删除:新建同名 Cookie 且 MaxAge=0,路径一致即可清除。

抱歉,评论功能暂时关闭!