首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化CookieManager/CookieStore

序列化CookieManager/CookieStore
EN

Stack Overflow用户
提问于 2012-07-02 01:43:03
回答 2查看 1.3K关注 0票数 3

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-02 01:44:18

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

例如:

代码语言:javascript
复制
public class NewCookieManager extends CookieManager implements Serializable{
  //Code here...
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-08 09:40:13

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

代码语言:javascript
复制
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管理器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11284266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档