android URLConnection 和 cookie

android URLConnection and cookies

我一直在努力尝试在 post 登录后保持会话,我想知道是否有人可以提供帮助。我打算尝试 Apache,但是 android documentation 声明他们已经从 Apache 转移到 Java 的 URLConnection。

  1. 如果我将 cookie 数据存储为额外的捆绑包,我该如何获取它 数据并将其添加回 CookieManager?

  2. 把cookie数据存成字符串再传是不是不好的形式 它到我的下一个 activity 使用 bundle extras?

  3. 我是否必须在每个 activity 中创建一个 CookieManager 并且基本上 在每次请求后存储它,重新分配它,然后发出我的下一个 要求?

    //Login.java: 私人 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. :(
    

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

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

3) 您必须实现自己的 CookieStore,然后创建一个 CookieManager 并使用 CookieHandler.setDefault(...) 设置其默认值。这适用于 whole-system 所以你不应该为每个 activity.

创建它

4) 如果你还想用你的方法。您可以通过 getHeaderFields() 方法从响应 header 中获取一个 Cookie,并查询 "Set-Cookie" 和 "Set-Cookie2" header。像那样构建 header 字符串 "Set-Cookie:Your-string-cookie-here" 并使用 HttpCookie.parse(headerString) 获取列表 HttpCookie object.

这是创建持久性 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);
    }
}