Android:如何存储Cookie?

时间:2010-11-02 22:49:07

标签: android cookies

在我的Android应用中,每个活动都会填充来自网络上某处的xml文件的数据。提供这些文件的网站有一个登录机制,可以使用cookie。

我知道如何向登录页面发出HTTP请求并接收cookie。我不知道的是,我如何存储它以在其他活动中重复使用它以及下次启动应用程序时。该cookie有效期为一年,因此我的应用程序的用户应该登录一次,然后再也不会再登录一年。

我该怎么做?我搜索了很多,但要么我使用了错误的关键字,要么互联网上没有简单的解决方案。我希望有人可以帮助我。

最诚挚的问候和感谢,Jan Oliver

5 个答案:

答案 0 :(得分:18)

使用CookieSyncManager存储您的Cookie值。它可以在应用程序启动时持续存在。

小心在KitKat上使用WebViewClient#shouldInterceptRequest内的CookieSyncManager。 It will deadlock

修改

API 21中已弃用

CookieSyncManager

  

此类已在API级别21中弃用。现在是WebView   根据需要自动同步Cookie。您不再需要创建   或使用CookieSyncManager。要手动强制同步,您可以使用   CookieManager方法flush(),它是同步替换   sync()

答案 1 :(得分:10)

看起来Android在内存实现中使用默认值,因此您需要创建自己的持久性cookie存储。

本Java教程概述了利用默认实现创建自己的持久存储。 http://download.oracle.com/javase/tutorial/networking/cookies/custom.html

该示例有两个todo用于存储(读/写)对于存储,我只使用SharedPreferences来存储您需要的会话cookie,而不是保留其他任何会话cookie。

该示例使用了一个在Android中不是您想要的关闭挂钩。代替run()和钩子,我只需要一个新的公共方法persist()来保存你想要的东西,尽管这需要你手工持久存储()。

鉴于您只有一个或两个重要的cookie,您可以将它们保存在add(...)

答案 2 :(得分:4)

进行http呼叫后,您可以抓住这样的cookie

List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
   Log.d(TAG,"no cookies received");
} else {
   for (int i = 0; i < cookies.size(); i++) {
      if(cookies.get(i).getName().contentEquals("PHPSESSID")) {
         PHPSESSID = cookies.get(i).getValue();
      }
   }
}

要发送回来:

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));
httppost.setEntity(new UrlEncodedFormEntity(aList));

aList就是你所有的名字来自

答案 3 :(得分:4)

LoopJ有一个内置的持久性cookie存储,可以在有或没有loopj框架的情况下使用

https://github.com/loopj/android-async-http/blob/master/library/src/main/java/com/loopj/android/http/PersistentCookieStore.java

答案 4 :(得分:0)

我写了一个名为CookieHelper的简单类,我提供了一个如何使用此类来帮助面临同样问题的所有用户的示例: https://github.com/augustopicciani/HttpClient-save-cookies-to-file