本文目录导读:

我来为您详细解析CookieManager如何管理HTTPCookie。
CookieManager 基本概念
主要类
- CookieManager - 核心管理器类
- CookieStore - Cookie存储接口
- HttpCookie - 单个Cookie对象
- CookiePolicy - Cookie接受策略
基础使用示例
import java.net.*;
import java.util.List;
public class CookieManagerExample {
public static void main(String[] args) {
// 1. 创建CookieManager
CookieManager cookieManager = new CookieManager();
// 2. 设置默认Cookie管理器
CookieHandler.setDefault(cookieManager);
// 3. 创建HttpCookie
HttpCookie cookie1 = new HttpCookie("username", "john_doe");
cookie1.setDomain(".example.com");
cookie1.setPath("/");
cookie1.setMaxAge(3600); // 1小时后过期
HttpCookie cookie2 = new HttpCookie("session_id", "abc123");
cookie2.setDomain(".example.com");
cookie2.setPath("/app");
cookie2.setSecure(true);
cookie2.setHttpOnly(true);
// 4. 添加Cookie到存储
try {
URI uri = new URI("https://www.example.com/app/login");
cookieManager.getCookieStore().add(uri, cookie1);
cookieManager.getCookieStore().add(uri, cookie2);
} catch (URISyntaxException e) {
e.printStackTrace();
}
// 5. 获取Cookie
try {
URI requestUri = new URI("https://www.example.com/app/dashboard");
Map<String, List<String>> headers = new HashMap<>();
// 自动添加匹配的Cookie
Map<String, List<String>> responseHeaders =
cookieManager.get(requestUri, headers);
List<String> cookies = responseHeaders.get("Cookie");
if (cookies != null) {
cookies.forEach(System.out::println);
}
// 6. 获取所有Cookie
List<HttpCookie> allCookies = cookieManager.getCookieStore().getCookies();
System.out.println("All stored cookies:");
allCookies.forEach(c -> System.out.println(c.getName() + "=" + c.getValue()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
自定义CookieStore
import java.net.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class CustomCookieStore implements CookieStore {
// 使用ConcurrentHashMap存储Cookie,键为域名
private final Map<String, List<HttpCookie>> cookieJar = new ConcurrentHashMap<>();
@Override
public void add(URI uri, HttpCookie cookie) {
String domain = cookie.getDomain();
if (domain == null && uri != null) {
domain = uri.getHost();
}
if (domain != null) {
cookieJar.computeIfAbsent(domain, k -> new ArrayList<>())
.add(cookie);
System.out.println("Added cookie: " + cookie.getName() +
" for domain: " + domain);
}
}
@Override
public List<HttpCookie> get(URI uri) {
List<HttpCookie> result = new ArrayList<>();
String targetDomain = uri.getHost();
// 遍历所有Cookie
cookieJar.forEach((domain, cookies) -> {
// 匹配域名(包含子域名匹配)
if (targetDomain.endsWith(domain) ||
domain.equals(targetDomain) ||
domain.startsWith(".") && targetDomain.endsWith(domain)) {
for (HttpCookie cookie : cookies) {
if (isCookieValid(cookie, uri)) {
result.add(cookie);
}
}
}
});
return result;
}
@Override
public List<HttpCookie> getCookies() {
List<HttpCookie> allCookies = new ArrayList<>();
cookieJar.values().forEach(allCookies::addAll);
return allCookies;
}
@Override
public List<URI> getURIs() {
Set<URI> uris = new HashSet<>();
cookieJar.keySet().forEach(domain -> {
try {
uris.add(new URI("http://" + domain));
} catch (URISyntaxException e) {
e.printStackTrace();
}
});
return new ArrayList<>(uris);
}
@Override
public boolean remove(URI uri, HttpCookie cookie) {
String domain = cookie.getDomain();
List<HttpCookie> cookies = cookieJar.get(domain);
if (cookies != null) {
boolean removed = cookies.remove(cookie);
if (cookies.isEmpty()) {
cookieJar.remove(domain);
}
return removed;
}
return false;
}
@Override
public boolean removeAll() {
cookieJar.clear();
return true;
}
// 辅助方法:检查Cookie是否有效
private boolean isCookieValid(HttpCookie cookie, URI uri) {
// 检查过期时间
if (cookie.hasExpired()) {
return false;
}
// 检查路径
String path = cookie.getPath();
if (path != null && !uri.getPath().startsWith(path)) {
return false;
}
// 检查Secure属性
if (cookie.getSecure() && !"https".equals(uri.getScheme())) {
return false;
}
return true;
}
}
完整的管理器实现
import java.net.*;
import java.io.*;
import java.util.*;
public class AdvancedCookieManager {
private final CookieManager cookieManager;
private final File cookieFile;
public AdvancedCookieManager() {
this.cookieManager = new CookieManager(new CustomCookieStore(),
CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(cookieManager);
this.cookieFile = new File("cookies.dat");
// 启动时加载持久化的Cookie
loadCookies();
}
// 添加Cookie
public void setCookie(String url, String name, String value,
String domain, String path) {
try {
HttpCookie cookie = new HttpCookie(name, value);
cookie.setDomain(domain);
cookie.setPath(path);
cookie.setMaxAge(86400); // 24小时
URI uri = new URI(url);
cookieManager.getCookieStore().add(uri, cookie);
} catch (Exception e) {
System.err.println("Error setting cookie: " + e.getMessage());
}
}
// 获取Cookie值
public String getCookieValue(String url, String name) {
try {
URI uri = new URI(url);
Map<String, List<String>> headers = new HashMap<>();
Map<String, List<String>> responseHeaders =
cookieManager.get(uri, headers);
List<String> cookieHeaders = responseHeaders.get("Cookie");
if (cookieHeaders != null) {
for (String cookieStr : cookieHeaders) {
String[] parts = cookieStr.split(";");
for (String part : parts) {
String[] keyValue = part.trim().split("=", 2);
if (keyValue.length == 2 && keyValue[0].equals(name)) {
return keyValue[1];
}
}
}
}
} catch (Exception e) {
System.err.println("Error getting cookie: " + e.getMessage());
}
return null;
}
// 删除Cookie
public void removeCookie(String url, String name) {
try {
URI uri = new URI(url);
List<HttpCookie> cookies = cookieManager.getCookieStore().get(uri);
for (HttpCookie cookie : cookies) {
if (cookie.getName().equals(name)) {
cookieManager.getCookieStore().remove(uri, cookie);
System.out.println("Removed cookie: " + name);
break;
}
}
} catch (Exception e) {
System.err.println("Error removing cookie: " + e.getMessage());
}
}
// 清除所有Cookie
public void clearAllCookies() {
cookieManager.getCookieStore().removeAll();
System.out.println("All cookies cleared");
}
// 列出所有Cookie
public void listAllCookies() {
List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
System.out.println("=== All Cookies ===");
for (HttpCookie cookie : cookies) {
System.out.printf("Name: %s, Value: %s, Domain: %s, Path: %s, Expiry: %s%n",
cookie.getName(), cookie.getValue(), cookie.getDomain(),
cookie.getPath(), cookie.getMaxAge());
}
System.out.println("Total: " + cookies.size() + " cookies");
}
// 持久化Cookie到文件
public void saveCookies() {
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(cookieFile))) {
List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
oos.writeObject(new ArrayList<>(cookies));
System.out.println("Saved " + cookies.size() + " cookies to file");
} catch (IOException e) {
System.err.println("Error saving cookies: " + e.getMessage());
}
}
// 从文件加载Cookie
@SuppressWarnings("unchecked")
public void loadCookies() {
if (!cookieFile.exists()) {
return;
}
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(cookieFile))) {
List<HttpCookie> cookies = (List<HttpCookie>) ois.readObject();
CookieStore store = cookieManager.getCookieStore();
for (HttpCookie cookie : cookies) {
URI uri = new URI("http://" + cookie.getDomain() + cookie.getPath());
store.add(uri, cookie);
}
System.out.println("Loaded " + cookies.size() + " cookies from file");
} catch (Exception e) {
System.err.println("Error loading cookies: " + e.getMessage());
}
}
// 使用示例
public static void main(String[] args) {
AdvancedCookieManager acm = new AdvancedCookieManager();
// 设置Cookie
acm.setCookie("https://www.example.com/login", "username", "admin",
".example.com", "/");
acm.setCookie("https://www.example.com/login", "token", "xyz789",
".example.com", "/");
// 获取Cookie
String username = acm.getCookieValue("https://www.example.com/dashboard",
"username");
System.out.println("Retrieved username: " + username);
// 列出所有Cookie
acm.listAllCookies();
// 保存到文件
acm.saveCookies();
// 删除指定Cookie
acm.removeCookie("https://www.example.com", "token");
// 清除所有
// acm.clearAllCookies();
}
}
主要特性说明
Cookie属性管理
- Domain: 控制Cookie作用域
- Path: 限制路径访问
- MaxAge: 设置过期时间
- Secure: 仅HTTPS传输
- HttpOnly: 禁止JavaScript访问
- Version: Cookie版本控制
安全最佳实践
// 创建安全Cookie
public static HttpCookie createSecureCookie(String name, String value) {
HttpCookie cookie = new HttpCookie(name, value);
cookie.setSecure(true);
cookie.setHttpOnly(true);
cookie.setMaxAge(3600);
cookie.setVersion(1);
return cookie;
}
// 验证Cookie安全性
public static boolean validateCookie(HttpCookie cookie) {
if (cookie.hasExpired()) return false;
if (cookie.getName().contains("session") ||
cookie.getName().contains("token")) {
return cookie.isHttpOnly() && cookie.getSecure();
}
return true;
}
CookieManager提供了灵活、安全的HTTPCookie管理机制,适用于Web客户端和服务器端的Cookie处理需求。