【问题标题】:Android: How to store cookies?Android:如何存储 cookie?
【发布时间】:2011-05-04 05:24:43
【问题描述】:

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

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

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

提前致以最诚挚的问候和感谢,扬·奥利弗

【问题讨论】:

  • 你在使用AndroidHttpClient吗?您是否确认没有被存储?我相信 AndroidHttpClient 的实现会以持久的方式为您处理 cookie 存储。
  • 它们的存储方式使得使用相同 httpclient 的后续请求可以识别它。但在关闭应用程序或切换活动并创建新的 httpclient 实例后,它们不会保留。

标签: android cookies


【解决方案1】:

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

注意在 KitKat 上的 WebViewClient#shouldInterceptRequest 内使用 CookieSyncManager。 It will deadlock.

编辑

CookieSyncManager 在 API 21 中已弃用:

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

【讨论】:

  • 在我看来这应该是正确的答案...只要您希望持久保存 cookie(而不是 RAM),就像 CookieSyncManager.getInstance().sync(); 一样简单
  • 这不是用来持久化浏览器cookie存储的吗?这也会在 Android 应用程序内的 HttpClient 上保留 cookie 吗?
  • 您可以很容易地将 CookieSyncManager 与 HttpClient 一起使用。有关 HttpClient cookie 处理的示例,请参见 stackoverflow.com/a/3587332/9636
  • CookieSyncManager 将在重启后持续存在
  • 文档显示这只能与webview一起使用
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢我正在寻找的答案。不幸的是,我解决了它现在存储登录凭据并在我启动应用程序时登录。然后通过静态类在 Activity 之间共享 HttpClient。不过还是谢谢!
  • 应避免在 Android 上使用运行时 addShutdownHook:来自该函数的 Android 文档“请注意,在 Android 上,应用程序生命周期不包括 VM 终止,因此调用此方法不会确保您的代码正在运行。相反,您应该使用最合适的生命周期通知(比如 Activity.onPause)。"
  • @janoliver 你不应该存储登录凭据!?
  • 在 add() 中保存 Cookie 不会考虑对 remove() 的调用 - 你不想这样做(至少,在没有类似的删除操作调用的情况下)。
  • 原来的问题是关于如何持久化 cookie。言下之意是,如果您想要完全管理,则需要使用您选择的管理解决方案填写所有功能,并且关闭挂钩的示例代码使用不适用于 Android。
【解决方案3】:

在你进行 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 就是你的名字ValuePairs

【讨论】:

  • 您阅读我的问题了吗?我在问如何将 cookie 存储在我的应用程序中,以供将来在其他活动甚至我的应用程序的其他运行中使用。
  • 这就是第一部分的作用,它提取您从网站收到的 cookie。在示例中,它正在获取名为“PHPSESSID”的 cookie。然后,您可以将其存储在字符串中。第二部分展示了如何在以后的页面中将cookie返回给服务器。
  • 如果我想保存服务器发送的所有 Cookie 怎么办?不只是那些我抓到的?
【解决方案4】:

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

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

【讨论】:

  • 这个库让我的生活变得轻松多了!
  • 接口与 java.net.CookieStore 不匹配。所以我不能将它与标准网络库一起使用?
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2015-08-24
    • 2016-04-13
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多