杰瑞科技汇

Java如何获取cookie?

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

下面我将详细讲解这三种情况。

Java如何获取cookie?-图1
(图片来源网络,侵删)

在 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

Java如何获取cookie?-图2
(图片来源网络,侵删)
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>

如何测试

  1. 你需要一个能设置 Cookie 的页面或 Servlet,你可以创建另一个 Servlet(SetCookieServlet),在其中使用 response.addCookie(new Cookie("username", "zhangsan")); 来设置一个 Cookie。
  2. 访问设置 Cookie 的页面。
  3. 然后访问 /getCookies 这个 URL,你就能看到上一步设置的 Cookie 信息了。

在爬虫或 HTTP 客户端中获取 Cookie

当你使用 Java 程序(爬虫)去访问一个网站时,网站服务器会通过 Set-Cookie 响应头向你发送 Cookie,你需要使用 HTTP 客户端库来捕获并存储这些 Cookie,以便在后续的请求中带上它们。

这里以流行的 JsoupApache HttpClient 为例。

Java如何获取cookie?-图3
(图片来源网络,侵删)

示例 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,你可以通过以下方式间接实现:

  1. 使用系统浏览器:启动系统默认浏览器,并导航到目标 URL,浏览器会处理所有 Cookie 的存储和发送,但这通常不是应用与网站交互的理想方式。
  2. 嵌入浏览器引擎:使用像 JavaFX WebViewJxBrowser 这样的库,在你的应用中嵌入一个完整的浏览器引擎,这样,你的应用就可以和浏览器引擎交互,间接获取 Cookie。
  3. 手动管理:这是最常见的方式,你的应用自己作为 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 的不同方法!

分享:
扫描分享到社交APP
上一篇
下一篇