Java Cookie案例如何读写操作

wen java案例 25

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");
    }
}

注意事项

  1. 编码问题:Cookie值不能包含空格、分号、逗号等特殊字符,建议进行URL编码

    Java Cookie案例如何读写操作

    String encodedValue = URLEncoder.encode("张三", "UTF-8");
    Cookie cookie = new Cookie("username", encodedValue);
    // 读取时解码
    String decodedValue = URLDecoder.decode(cookie.getValue(), "UTF-8");
  2. 安全考虑

    • 敏感信息不要存储在Cookie中
    • 设置HttpOnly防止XSS攻击
    • 使用Secure确保HTTPS传输
    • 设置合适的Path和Domain范围
  3. 大小限制:单个Cookie大小不超过4KB,每个域名下Cookie总数不超过20个

  4. 浏览器兼容性:不同浏览器对Cookie的支持有差异,注意测试

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