android URLConnection and cookies



我一直在努力在登录后试图维护会话,我想知道是否有人可以提供帮助。我打算尝试Apache,但Android文档指出他们已经离开了Apache,转而使用Java的URLConnection。

  1. 如果我将 cookie 数据存储为捆绑包,我该如何获取数据并将其重新添加到 CookieManager 中?

  2. 将 cookie 数据存储成字符串然后传递是不是不好的形式它到我的下一个活动使用捆绑附加功能?

  3. 我是否必须在每个活动中创建一个饼干管理器,基本上在每个请求后存储它,重新分配它,然后发出我的下一个请求?

    登录.java: private CookieManager loginCookie = new CookieManager(); extras.putString("Cookies", loginCookie.toString());

    //LoggedIn.java:
    Bundle bundle = intent.getExtras();
    String strCookies = bundle.getString("Cookies");
    SummaryCookies = (CookieManager)strCookies; //I tried casting the strCookies back to a CookieManager, but that did not work. :(
    

如何从 strCookie 获取我的 cookie 并将其转换回 CookieManager 理解的格式?

1+2) 我认为这不是使用 Cookie 的好方法,因为当您停止应用程序时,此 cookie 也会被删除。应将它们保存到持久存储中,以便稍后使用。

3)你必须实现你自己的CookieStore,然后创建一个CookieManager并使用CookieHandler.setDefault(...)设置其默认值。这适用于整个系统,因此您不应该为每个活动创建它。

4)如果您仍然想使用您的方法。您可以通过getHeaderFields()方法从响应标头中获取Cookie,并查询"Set-Cookie"和"Set-Cookie2"标头。构建你的标头字符串,如"Set-Cookie:Your-string-cookie-here",并使用HttpCookie.parse(headerString)来获取你的列表HttpCookie对象。

这是创建持久 Cookie 存储的示例。如果需要,这里是完整的来源: https://github.com/nguyentrungduy/Customize-CookieStore

@Override
public void add(URI uri, HttpCookie cookie) {
    // TODO Auto-generated method stub
    synchronized (this) {
        URI uri2 = createURI(uri);
        List<HttpCookie> cookies = mCookies.get(uri2);
        if (cookies == null) {
            cookies = new ArrayList<HttpCookie>();
            mCookies.put(uri2, cookies);
        } else {
            cookies.remove(cookie);
        }
        cookies.add(cookie);
        // Save into SharePreferenced
        saveToPersistent(uri2, cookies);
    }
}
@Override
public List<HttpCookie> get(URI uri) {
    // TODO Auto-generated method stub
    synchronized (this) {
        List<HttpCookie> httpCookies = new ArrayList<HttpCookie>();
        List<HttpCookie> values = mCookies.get(uri);
        if (values != null) {
            for (HttpCookie httpCookie : values) {
                if (!httpCookie.hasExpired()) {
                    httpCookies.add(httpCookie);
                }
            }
        }
        Set<Entry<URI, List<HttpCookie>>> set = mCookies.entrySet();
        for (Entry<URI, List<HttpCookie>> entry : set) {
            if (uri.equals(entry.getKey())) {
                continue;
            }
            List<HttpCookie> cookies = entry.getValue();
            Iterator<HttpCookie> iterator = cookies.iterator();
            while (iterator.hasNext()) {
                HttpCookie cookie = iterator.next();
                String domain = cookie.getDomain();
                if (!domainMatches(domain, uri.getHost())) {
                    continue;
                }
                if (cookie.hasExpired()) {
                    iterator.remove();
                } else if (!httpCookies.contains(cookie)) {
                    httpCookies.add(cookie);
                }
            }
        }
        return Collections.unmodifiableList(httpCookies);
    }
}

最新更新