android URLConnection 和 cookie
android URLConnection and cookies
我一直在努力尝试在 post 登录后保持会话,我想知道是否有人可以提供帮助。我打算尝试 Apache,但是 android documentation 声明他们已经从 Apache 转移到 Java 的 URLConnection。
如果我将 cookie 数据存储为额外的捆绑包,我该如何获取它
数据并将其添加回 CookieManager?
把cookie数据存成字符串再传是不是不好的形式
它到我的下一个 activity 使用 bundle extras?
我是否必须在每个 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);
}
}
我一直在努力尝试在 post 登录后保持会话,我想知道是否有人可以提供帮助。我打算尝试 Apache,但是 android documentation 声明他们已经从 Apache 转移到 Java 的 URLConnection。
如果我将 cookie 数据存储为额外的捆绑包,我该如何获取它 数据并将其添加回 CookieManager?
把cookie数据存成字符串再传是不是不好的形式 它到我的下一个 activity 使用 bundle extras?
我是否必须在每个 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);
}
}