Cookie 是Servlet用来在客户端存储少量数据的机制,常用于会话管理、用户偏好设置等。本文将介绍如何在Servlet中创建、读取和操作Cookie。


目录

  1. Cookie 概述
  2. 创建和设置Cookie
  3. 读取Cookie
  4. 修改和删除Cookie
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. Cookie 概述

  • 定义:Cookie 是服务器发送到客户端的小文本数据,存储在浏览器中,随后续请求返回服务器。
  • 用途
  • 跟踪用户会话。
  • 保存用户偏好。
  • Servlet API:通过 HttpServletResponse 添加Cookie,通过 HttpServletRequest 获取Cookie。

2. 创建和设置Cookie

基本方法

使用 Cookie 类创建,并通过 addCookie() 添加到响应:

Cookie cookie = new Cookie("username", "Alice");
response.addCookie(cookie);

设置属性

  • 有效期setMaxAge(int seconds),单位秒,-1表示浏览器关闭时失效。
  • 路径setPath(String path),指定Cookie有效路径。
Cookie cookie = new Cookie("theme", "dark");
cookie.setMaxAge(60 * 60 * 24); // 1天
cookie.setPath("/myapp"); // 仅在/myapp下有效
response.addCookie(cookie);

3. 读取Cookie

HttpServletRequest 获取Cookie数组:

Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("username".equals(cookie.getName())) {
            String value = cookie.getValue();
            out.println("用户: " + value);
        }
    }
}

4. 修改和删除Cookie

修改Cookie

重新设置同名Cookie:

Cookie cookie = new Cookie("username", "Bob"); // 新值覆盖旧值
cookie.setMaxAge(60 * 60); // 1小时
response.addCookie(cookie);

删除Cookie

将有效期设为0:

Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0); // 立即失效
response.addCookie(cookie);

5. 完整示例

以下是一个展示Cookie操作的Servlet。

HTML:cookie.html

<!DOCTYPE html>
<html>
<head><title>Cookie 测试</title></head>
<body>
    <form method="POST" action="/myapp/cookie">
        用户名: <input type="text" name="username"><br>
        <input type="submit" value="设置Cookie">
    </form>
    <a href="/myapp/cookie?action=delete">删除Cookie</a>
</body>
</html>

Servlet:CookieServlet.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String action = request.getParameter("action");
        if ("delete".equals(action)) {
            Cookie cookie = new Cookie("username", "");
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            out.println("<h1>Cookie 已删除</h1>");
        } else {
            Cookie[] cookies = request.getCookies();
            String username = "未设置";
            if (cookies != null) {
                for (Cookie c : cookies) {
                    if ("username".equals(c.getName())) {
                        username = c.getValue();
                    }
                }
            }
            out.println("<h1>当前用户: " + username + "</h1>");
        }
        out.println("<a href=\"/myapp/cookie.html\">返回</a>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        if (username != null && !username.trim().isEmpty()) {
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 24); // 1天
            response.addCookie(cookie);
            out.println("<h1>Cookie 设置成功: " + username + "</h1>");
        } else {
            out.println("<h1>请输入用户名</h1>");
        }
        out.println("<a href=\"/myapp/cookie.html\">返回</a>");
    }
}

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookie</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar CookieServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. cookie.html 放入 myapp/
  3. 更新 web.xml
  4. 部署 myapp 到Tomcat的 webapps 目录。
  5. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/cookie.html
  • 输入用户名并提交:显示“Cookie 设置成功”。
  • 刷新页面:显示“当前用户: [用户名]”。
  • 点击“删除Cookie”:显示“Cookie 已删除”,刷新后恢复“未设置”。

7. 参考资料

出站链接

其他资源

  • 《Servlet & JSP: A Tutorial》 – Cookie处理章节。
  • X社区:搜索 #ServletCookie 获取示例。

这篇指南展示了Servlet中Cookie的创建、读取和删除。如果需要更复杂功能(如加密Cookie或多Cookie管理),请告诉我!