- Java Web 开发 (Servlet/JSP):这是最常见的情况,在服务器端处理 HTTP 请求时获取客户端发送过来的 Cookie。
- 爬虫/HTTP 客户端 (如 Jsoup, Apache HttpClient, OkHttp):当你需要模拟浏览器行为,向一个网站发送请求并获取服务器返回的 Cookie 时。
- 桌面/移动应用 (JavaFX/Swing):在客户端应用中,你通常需要手动管理 Cookie,因为应用本身不处理 HTTP 会话。
下面我将详细讲解这三种情况。

在 Java Web 开发中获取 Cookie (Servlet 环境)
在服务器端,当一个客户端(如浏览器)发送请求时,它会将之前服务器设置的 Cookie 一起带上,Servlet API 提供了 HttpServletRequest 对象来方便地获取这些 Cookie。
核心方法
HttpServletRequest 类中的 getCookies() 方法是关键。
public javax.servlet.Cookie[] getCookies()
- 返回值:一个
Cookie对象的数组,如果请求中没有包含 Cookie,则返回null。 - 注意:返回的是
javax.servlet.Cookie,而不是java.net.Cookie。
完整示例代码
这是一个完整的 Servlet 示例,演示如何从请求中获取 Cookie 并打印出来。
创建一个 Servlet

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 从请求中获取所有的 Cookie
Cookie[] cookies = request.getCookies();
// 2. 检查是否存在 Cookie
if (cookies != null) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h2>获取到的 Cookie 列表:</h2>");
// 3. 遍历 Cookie 数组
for (Cookie cookie : cookies) {
// 获取 Cookie 的名称和值
String name = cookie.getName();
String value = cookie.getValue();
// 打印信息
out.println("<p>Cookie 名称: " + name + "</p>");
out.println("<p>Cookie 值: " + value + "</p>");
out.println("<hr>");
}
} else {
response.getWriter().println("<h2>本次请求中没有携带任何 Cookie。</h2>");
}
}
}
在 web.xml 中配置 Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>GetCookieServlet</servlet-name>
<servlet-class>GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetCookieServlet</servlet-name>
<url-pattern>/getCookies</url-pattern>
</servlet-mapping>
</web-app>
如何测试
- 你需要一个能设置 Cookie 的页面或 Servlet,你可以创建另一个 Servlet(
SetCookieServlet),在其中使用response.addCookie(new Cookie("username", "zhangsan"));来设置一个 Cookie。 - 访问设置 Cookie 的页面。
- 然后访问
/getCookies这个 URL,你就能看到上一步设置的 Cookie 信息了。
在爬虫或 HTTP 客户端中获取 Cookie
当你使用 Java 程序(爬虫)去访问一个网站时,网站服务器会通过 Set-Cookie 响应头向你发送 Cookie,你需要使用 HTTP 客户端库来捕获并存储这些 Cookie,以便在后续的请求中带上它们。
这里以流行的 Jsoup 和 Apache HttpClient 为例。

示例 1:使用 Jsoup
Jsoup 主要用于解析 HTML,但也提供了简单的 HTTP 请求功能。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.util.Map;
public class JsoupCookieExample {
public static void main(String[] args) {
// 第一次请求,获取服务器返回的 Cookie
try {
// 发送 GET 请求到登录页面,服务器会返回 Set-Cookie 头
Document doc = Jsoup.connect("https://example.com/login")
.data("username", "myuser", "password", "mypassword")
.post(); // 假设是登录表单,使用 post
// Jsoup 会自动将响应中的 Cookie 存储在会话中
// 你可以通过 session 获取这些 Cookie
Map<String, String> cookies = Jsoup.connect("https://example.com/dashboard")
.cookies(doc.cookies()) // 将上一步获取的 Cookie 应用到新请求中
.get().cookies();
System.out.println("获取到的 Cookie:");
for (Map.Entry<String, String> entry : cookies.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例 2:使用 Apache HttpClient (更专业)
HttpClient 是一个功能更强大的 HTTP 客户端库,对 Cookie 的支持非常完善。
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClientCookieExample {
public static void main(String[] args) throws Exception {
// 1. 创建一个 CookieStore 来存储 Cookie
CookieStore cookieStore = new BasicCookieStore();
// 2. 创建 HttpClient,并关联 CookieStore
try (CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build()) {
// 3. 发送第一个请求(例如登录)
HttpPost loginRequest = new HttpPost("https://example.com/login");
// 可以设置请求体,如 loginRequest.setEntity(...);
HttpResponse loginResponse = httpClient.execute(loginRequest);
// 服务器返回的 Cookie 会自动被存储在 cookieStore 中
System.out.println("登录后获取到的 Cookie:");
cookieStore.getCookies().forEach(System.out::println);
// 4. 发送第二个请求(访问需要登录的页面)
// HttpClient 会自动从 cookieStore 中取出 Cookie 并附加到请求中
HttpGet protectedPageRequest = new HttpGet("https://example.com/dashboard");
HttpResponse protectedPageResponse = httpClient.execute(protectedPageRequest);
HttpEntity entity = protectedPageResponse.getEntity();
if (entity != null) {
String responseString = EntityUtils.toString(entity);
System.out.println("\n受保护页面的内容 (部分):");
System.out.println(responseString.substring(0, 200)); // 打印前200个字符
}
EntityUtils.consume(entity); // 确保实体内容被完全消费
}
}
}
在桌面/客户端应用中获取 Cookie
在桌面应用(如使用 JavaFX/Swing 开发的程序)中,应用本身不处理 HTTP 协议,因此无法直接“获取” Cookie,你可以通过以下方式间接实现:
- 使用系统浏览器:启动系统默认浏览器,并导航到目标 URL,浏览器会处理所有 Cookie 的存储和发送,但这通常不是应用与网站交互的理想方式。
- 嵌入浏览器引擎:使用像 JavaFX WebView 或 JxBrowser 这样的库,在你的应用中嵌入一个完整的浏览器引擎,这样,你的应用就可以和浏览器引擎交互,间接获取 Cookie。
- 手动管理:这是最常见的方式,你的应用自己作为 HTTP 客户端(如使用 HttpClient),手动向服务器发送请求,接收并存储服务器返回的
Set-Cookie头信息,然后在后续请求中手动将其作为Cookie请求头发送,这实际上和情况二中的 HttpClient 完全一样。
对于客户端应用,推荐使用 HttpClient 的方式来手动管理 Cookie。
| 场景 | 核心方法/库 | 关键点 |
|---|---|---|
| Java Web (Servlet) | request.getCookies() |
服务器端获取客户端发送的 Cookie,返回 javax.servlet.Cookie[] 数组。 |
| 爬虫/HTTP 客户端 | Jsoup, Apache HttpClient |
获取:捕获服务器 Set-Cookie 响应头。使用:将获取的 Cookie 存储起来,并在后续请求中作为 Cookie 请求头发送,HttpClient 的 CookieStore 能自动处理。 |
| 桌面/客户端应用 | Apache HttpClient (手动管理) |
应用本身不处理 Cookie,需通过 HTTP 客户端库模拟浏览器行为,手动获取、存储和发送 Cookie。 |
希望这个详细的解释能帮助你理解在 Java 中获取 Cookie 的不同方法!
