CookieManager管理HTTPCookie

wen java案例 1

本文目录导读:

CookieManager管理HTTPCookie

  1. CookieManager 基本概念
  2. 基础使用示例
  3. 自定义CookieStore
  4. 完整的管理器实现
  5. 主要特性说明

我来为您详细解析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处理需求。

抱歉,评论功能暂时关闭!