- 在 Web 应用中(如 Servlet)获取客户端发送过来的 Cookie。
- 在 Java 程序(如爬虫或工具)中,作为客户端向服务器发送请求并获取服务器返回的 Cookie。
下面我将分别详细介绍这两种情况。

在 Web 应用(Servlet/JSP)中获取客户端 Cookie
这是最常见的服务器端场景,当浏览器访问一个网站时,它会带上之前服务器设置的 Cookie,服务器端(Servlet)可以通过 HttpServletRequest 对象来读取这些 Cookie。
核心步骤
- 获取
Cookie数组:使用request.getCookies()方法,这个方法返回一个Cookie对象的数组,如果客户端没有发送任何 Cookie,该方法会返回null。 - 遍历数组:获取数组后,需要遍历它来找到你想要的那个 Cookie。
- 通过
getName()和getValue()获取信息:每个Cookie对象都有name(名称)和value(值)属性。
完整代码示例
这是一个简单的 Servlet 示例,它会获取所有客户端发送过来的 Cookie 并打印它们的名称和值。
创建一个 Servlet
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;
import java.io.PrintWriter;
// @WebServlet 注解将这个类映射到 /getCookies 路径
@WebServlet("/getCookies")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 从 request 对象中获取所有 Cookie
Cookie[] cookies = request.getCookies();
// 设置响应内容类型为 HTML
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 2. 检查是否存在 Cookie
if (cookies != null && cookies.length > 0) {
out.println("<h2>获取到的 Cookie 列表:</h2>");
out.println("<ul>");
// 3. 遍历 Cookie 数组
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
// 打印每个 Cookie 的名称和值
out.println("<li>");
out.println("Name: " + name + ", Value: " + value);
out.println("</li>");
}
out.println("</ul>");
} else {
out.println("<h2>客户端没有发送任何 Cookie。</h2>");
}
}
}
如何测试

- 首先设置一个 Cookie:你需要先访问一个能设置 Cookie 的页面(比如另一个 Servlet),或者用浏览器的开发者工具手动添加一个 Cookie。
- 访问获取 Cookie 的 Servlet:在浏览器中访问
http://localhost:8080/your-app-name/getCookies。 - 查看结果:你将在页面上看到所有浏览器发送给当前应用的 Cookie 列表。
获取特定名称的 Cookie
通常我们只需要获取某一个特定的 Cookie,可以写一个辅助方法。
public Cookie getCookieByName(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie;
}
}
}
return null; // 如果没有找到,返回 null
}
// 在 doGet 方法中使用
Cookie userCookie = getCookieByName(request, "username");
if (userCookie != null) {
String username = userCookie.getValue();
out.println("欢迎回来, " + username);
} else {
out.println("未找到 username Cookie。");
}
在 Java 程序(客户端)获取服务器 Cookie
当你使用 Java 程序(使用 HttpURLConnection 或第三方库如 Apache HttpClient, OkHttp)作为客户端去访问一个网站时,服务器响应中可能会包含 Set-Cookie 头,你需要从响应中解析出这些 Cookie,并在后续的请求中带上它们,以维持会话(Session)。
核心步骤
- 发送 HTTP 请求:向目标服务器发送第一次请求。
- 获取响应头:从
HttpURLConnection或HttpResponse对象中获取Set-Cookie头部信息。 - 解析 Cookie:
Set-Cookie头的格式可能包含多个 Cookie,每个 Cookie 由name=value对组成,并可能附带Path,Domain,Expires等属性,你需要手动解析这个字符串,或者使用更高级的库来处理。 - 存储 Cookie:将解析出的 Cookie 存储起来,例如在一个
Map<String, String>中。 - 在后续请求中发送 Cookie:在向同一服务器的后续请求中,将存储的 Cookie 放入
Cookie请求头中。
代码示例(使用 HttpURLConnection)
这个例子演示了如何手动处理 Cookie。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HttpClientWithCookie {
// 用于存储会话的 Cookie
private static final Map<String, String> cookieStore = new HashMap<>();
public static void main(String[] args) throws IOException {
// 目标 URL,这个 URL 在首次访问时会设置一个 Session Cookie
String urlString = "https://www.example.com/login"; // 假设这是一个登录页面
// 1. 第一次请求,获取服务器设置的 Cookie
String firstResponse = sendGetRequest(urlString);
System.out.println("第一次请求响应(部分):");
System.out.println(firstResponse.substring(0, Math.min(firstResponse.length(), 200)) + "...");
// 2. 第二次请求,带上之前获取的 Cookie
// 访问一个需要登录才能看到的页面
String protectedUrl = "https://www.example.com/dashboard";
String secondResponse = sendGetRequest(protectedUrl);
System.out.println("\n第二次请求响应(部分):");
System.out.println(secondResponse.substring(0, Math.min(secondResponse.length(), 200)) + "...");
}
public static String sendGetRequest(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// 3. 从响应头中获取 Set-Cookie 并解析
List<String> cookiesHeader = connection.getHeaderFields().get("Set-Cookie");
if (cookiesHeader != null) {
for (String cookieStr : cookiesHeader) {
// 简单解析:只取 name=value 部分
String[] parts = cookieStr.split(";")[0].split("=");
if (parts.length == 2) {
String name = parts[0].trim();
String value = parts[1].trim();
cookieStore.put(name, value);
System.out.println("从服务器获取到 Cookie: " + name + " = " + value);
}
}
}
// 4. 在后续请求中设置 Cookie 请求头
if (!cookieStore.isEmpty()) {
StringBuilder cookieHeader = new StringBuilder();
for (Map.Entry<String, String> entry : cookieStore.entrySet()) {
cookieHeader.append(entry.getKey()).append("=").append(entry.getValue()).append("; ");
}
connection.setRequestProperty("Cookie", cookieHeader.toString());
System.out.println("在请求中设置 Cookie: " + cookieHeader.toString());
}
// 读取响应内容
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()))) {
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
return content.toString();
} finally {
connection.disconnect();
}
}
}
更好的选择:使用 HttpClient (推荐)
手动处理 Cookie 非常繁琐且容易出错,在生产环境中,强烈推荐使用成熟的 HTTP 客户端库,它们内置了 Cookie 管理功能。
使用 Apache HttpClient 示例
你需要添加 Maven 依赖:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version> <!-- 使用最新版本 -->
</dependency>
代码:
import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.http.protocol.BasicHttpContext; import org.apache.hc.core5.http.protocol
