Java 序列化CookieManager/CookieStore

Java 序列化CookieManager/CookieStore,java,cookies,Java,Cookies,我正在制作一个访问网站的Java程序,它依赖于分发cookies,这样我就可以登录了。我发现使用CookieManager将允许我的URLConnection至少收集这些cookie,但是当java程序关闭时,我如何让这些cookie保持 我已经有了一个类来管理一些变量的序列化,那么如何在这个序列化过程中实现cookie呢?Java显然不允许我在默认情况下序列化CookieManager和CookieStores。您可以扩展CookieManager并使其实现可序列化。然后使用刚刚创建的扩展Co

我正在制作一个访问网站的Java程序,它依赖于分发cookies,这样我就可以登录了。我发现使用CookieManager将允许我的URLConnection至少收集这些cookie,但是当java程序关闭时,我如何让这些cookie保持


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

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

例如:

public class NewCookieManager extends CookieManager implements Serializable{
  //Code here...
}

您可以使用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;
    }
}
公共类KeepHeaderScookeManager扩展了CookieManager{
私有映射cookieHeaders=newHashMap();
公共keepheadersookiemanager(){
}
public KeepHeaderScookeManager(映射cookieHeaders)引发IOException{
对于(uriu:cookieHeaders.keySet()){
放(u,cookieHeaders.get(u));
}
}
@凌驾
公共void put(URI,映射响应头)引发IOException{
super.put(uri,responseHeaders);
Map UriCookieHeaders=cookieHeaders.computeIfAbsent(uri,u->new HashMap());
List uriSetCookieHeaders=uriCookiesHeaders.computeIfAbsent(“设置Cookie”,h->new ArrayList());
List uriSetCookie2Headers=uriCookiesHeaders.computeIfAbsent(“Set-Cookie2”,h->new ArrayList());
List setCookieHeaders=responseHeaders.getOrDefault(“Set Cookie”,new ArrayList());
List setCookie2Headers=responseHeaders.getOrDefault(“Set-Cookie2”,new ArrayList());
addAll(setCookieHeaders);
addAll(setCookie2Headers);
}
公共映射getCookieHeaders(){
返回Cookie标题;
}
}

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

实际上,我不太清楚如何使CookieManager完全可序列化。我的新类扩展了CookieManager并实现了Serializable,但是接下来我需要做什么呢?现在,内部的cookie存储没有保留以前运行会话中的任何cookie。对,所以这里是//代码。。。我感到困惑的部分。有什么我应该看的读物吗?我只是不明白为什么曲奇饼没有被正确地读回。我不想改变CookieManager的功能,只是让它可以序列化。也许它会对某些人有用
org.apache.http.client.CookieStore
是一个接口。它的默认实现是
basiccokiestore
,它已经实现了
Serializable
。您可能希望正确覆盖具有相同名称的Cookie。