杰瑞科技汇

Java中如何获取cookie?

  1. 在 Web 应用中(如 Servlet)获取客户端发送过来的 Cookie。
  2. 在 Java 程序(如爬虫或工具)中,作为客户端向服务器发送请求并获取服务器返回的 Cookie。

下面我将分别详细介绍这两种情况。

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

在 Web 应用(Servlet/JSP)中获取客户端 Cookie

这是最常见的服务器端场景,当浏览器访问一个网站时,它会带上之前服务器设置的 Cookie,服务器端(Servlet)可以通过 HttpServletRequest 对象来读取这些 Cookie。

核心步骤

  1. 获取 Cookie 数组:使用 request.getCookies() 方法,这个方法返回一个 Cookie 对象的数组,如果客户端没有发送任何 Cookie,该方法会返回 null
  2. 遍历数组:获取数组后,需要遍历它来找到你想要的那个 Cookie。
  3. 通过 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>");
        }
    }
}

如何测试

Java中如何获取cookie?-图2
(图片来源网络,侵删)
  1. 首先设置一个 Cookie:你需要先访问一个能设置 Cookie 的页面(比如另一个 Servlet),或者用浏览器的开发者工具手动添加一个 Cookie。
  2. 访问获取 Cookie 的 Servlet:在浏览器中访问 http://localhost:8080/your-app-name/getCookies
  3. 查看结果:你将在页面上看到所有浏览器发送给当前应用的 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)。

核心步骤

  1. 发送 HTTP 请求:向目标服务器发送第一次请求。
  2. 获取响应头:从 HttpURLConnectionHttpResponse 对象中获取 Set-Cookie 头部信息。
  3. 解析 CookieSet-Cookie 头的格式可能包含多个 Cookie,每个 Cookie 由 name=value 对组成,并可能附带 Path, Domain, Expires 等属性,你需要手动解析这个字符串,或者使用更高级的库来处理。
  4. 存储 Cookie:将解析出的 Cookie 存储起来,例如在一个 Map<String, String> 中。
  5. 在后续请求中发送 Cookie:在向同一服务器的后续请求中,将存储的 Cookie 放入 Cookie 请求头中。

代码示例(使用 HttpURLConnection

这个例子演示了如何手动处理 Cookie。

Java中如何获取cookie?-图3
(图片来源网络,侵删)
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
分享:
扫描分享到社交APP
上一篇
下一篇