本文目录导读:

我来为您详细解析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处理需求。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播