3

我正在制作一个访问网站的 Java 程序,这取决于分发 cookie,以便我可以登录。我发现使用 CookieManager 将允许我的 URLConnection 至少收集这些 cookie,但是我怎么拥有当java程序关闭时,这些cookies仍然存在吗?

我已经有一个类来管理一些变量的序列化,那么如何在这个序列化过程中实现 cookie?默认情况下,Java 显然不允许我序列化 CookieManager 和 CookieStore。

4

2 回答 2

2

您可以扩展 CookieManager 并使其实现可序列化。然后使用您刚刚创建的扩展 CookieManager。

例如:

public class NewCookieManager extends CookieManager implements Serializable{
  //Code here...
}
于 2012-07-01T17:44:18.233 回答
0

您可以使用 cookie 管理器将所有 cookie 标头保存在可序列化的映射中。您可以调用该put方法使其再次解析 cookie 标头。

public class KeepHeadersCookieManager extends CookieManager {

    private Map<URI, Map<String, List<String>>> cookieHeaders = new HashMap<>();

    public KeepHeadersCookieManager() {
    }

    public KeepHeadersCookieManager(Map<URI, Map<String, List<String>>> cookieHeaders) throws IOException {
        for (URI u : cookieHeaders.keySet()) {
            put(u, cookieHeaders.get(u));
        }
    }

    @Override
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        super.put(uri, responseHeaders);

        Map<String, List<String>> uriCookiesHeaders = cookieHeaders.computeIfAbsent(uri, u -> new HashMap<>());
        List<String> uriSetCookieHeaders = uriCookiesHeaders.computeIfAbsent("Set-Cookie", h -> new ArrayList<>());
        List<String> uriSetCookie2Headers = uriCookiesHeaders.computeIfAbsent("Set-Cookie2", h -> new ArrayList<>());
        List<String> setCookieHeaders = responseHeaders.getOrDefault("Set-Cookie", new ArrayList<>());
        List<String> setCookie2Headers = responseHeaders.getOrDefault("Set-Cookie2", new ArrayList<>());
        uriSetCookieHeaders.addAll(setCookieHeaders);
        uriSetCookie2Headers.addAll(setCookie2Headers);
    }

    public Map<URI, Map<String, List<String>>> getCookieHeaders() {
        return cookieHeaders;
    }
}

这样,您可以调用 getCookieHeaders() 来获取所有 cookie 标头的可序列化映射,并将其传递回构造函数以从先前的状态初始化 cookie 管理器。

于 2020-02-08T01:40:13.093 回答