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的主要内容,如果未能解决你的问题,请参考以下文章