【问题标题】:android URLConnection and cookiesandroid URLConnection 和 cookie
【发布时间】:2015-06-25 10:44:24
【问题描述】:
我一直在努力尝试在登录后保持会话,我想知道是否有人可以提供帮助。我本来打算尝试 Apache,但 android documentation 表示他们已经放弃了 Apache,转而使用 Java 的 URLConnection。
如果我将 cookie 数据存储为额外的捆绑包,我该如何处理
数据并将其添加回 CookieManager?
将cookie数据存储成字符串然后传
使用捆绑附加功能将它用于我的下一个活动?
-
我是否必须在每个活动中创建一个 CookieManager 并且基本上
在每个请求之后存储它,重新分配它,然后发出我的下一个
请求?
//登录.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 可以理解的格式?
【问题讨论】:
标签:
java
android
cookies
httpurlconnection
【解决方案1】:
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);
}
}