Android HttpClient 持久性 cookie

Posted

技术标签:

【中文标题】Android HttpClient 持久性 cookie【英文标题】:Android HttpClient persistent cookies 【发布时间】:2010-11-10 16:54:12 【问题描述】:

更新:不应再向阅读本文的任何人推荐此问题及其答案。 Android no-longer recommends HttpClient (read: deprecated), and instead recommends HttpUrlConnection。现在使用的库的一个很好的例子是Retrofit 和OkHttp。在这个问题的上下文中,cookie 可以与后续查询一起保存、存储和交付。这不是透明处理的。 OkHttp you can use Interceptors。

我有一个具有多个意图的 android 应用程序。

第一个意图是登录表单,后续意图依赖于登录过程提供的 cookie。

我遇到的问题是 cookie 似乎没有在意图中持续存在。我在每个意图中创建新的 HttpClients(我最初尝试将 Parcelable 传输到每个意图,但效果不佳)。

有没有人有任何关于使 cookie 在意图中持久存在的技巧?

【问题讨论】:

顺便说一句,我发现最接近的是将 cookiestore 写入共享首选项。 为了结束这个讨论,我成功地完成了我的任务,创建了我自己的 HttpClient 类,其中包含设置和获取其 CookieStore 的方法。我这样做是为了在初始化客户端时自动从 SharedPreferences 中检索所有 cookie。此外,在每次创建新 Intent 或完成当前 Intent 之前,所有 cookie 都会复制到 SharedPreferences 中。 【参考方案1】:

您可以按照@Emmanuel 的建议进行操作,也可以在您正在创建的 HttpClient 之间传递 BasicHttpContext。

上下文和 cookie 的使用示例,complete code here

    HttpClient httpclient = new DefaultHttpClient();

    // Create a local instance of cookie store
    CookieStore cookieStore = new BasicCookieStore();

    // Create local HTTP context
    HttpContext localContext = new BasicHttpContext();
    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    HttpGet httpget = new HttpGet("http://www.google.com/", localContext);

【讨论】:

感谢您提供的信息,这似乎是我的最佳选择。【参考方案2】:

不要创建新的 HttpClients;这将清除 cookie。重用单个 HttpClient。

【讨论】:

所以我可以将 httpclient 设为静态。 @vsk:是的。例如,您可以使用 Singleton。我通常会创建一个 ConnectionHelper Singleton,我可以在其中序列化对服务器的请求。【参考方案3】:

让你的 httpClient 成为一个单例类。

【讨论】:

【参考方案4】:

在Application类中定义HttpClient,在activity中使用。

在应用中

public class AAA extends Application 
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

在活动中

AAA aaa = (AAA)getApplication();
httpClient = app.httpClient;

【讨论】:

您无法控制应用程序的状态,如果您使用此功能,请确保执行空值检查或 AAA 中的方法以通过此检查获取客户端。

以上是关于Android HttpClient 持久性 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据持久保存从 PHP 到 Android [关闭]

每个代理而不是每个路由的 Apache HttpClient 4 个持久连接

Http 持久连接与 HttpClient 连接池

Http 持久连接与 HttpClient 连接池

学习充电Http 持久连接与 HttpClient 连接池

Http 持久连接与 HttpClient 连接池