Android HttpClient持久化Cookie

37

更新:本问题及其答案不再建议任何人阅读。 Android不再推荐使用HttpClient(即已弃用),而是推荐使用HttpUrlConnection。现在使用的好例子是RetrofitOkHttp。在这个问题的上下文中,可以保存、存储并随后查询传递cookie。这不是透明处理的。 通过OkHttp,您可以使用Interceptors

我有一个带有多个意图的Android应用程序。

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

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

是否有人对使cookie在意图之间持久存在有任何提示?


顺便说一下,我找到的最接近的方法是将cookiestore写入共享偏好中。 - Knossos
为了结束这个讨论,我通过创建自己的HttpClient类并编写设置和获取CookieStore方法的方式成功完成了我的任务。我使它在初始化客户端时自动从SharedPreferences中检索所有cookie。此外,在每次创建新Intent或完成当前Intent之前,都会将所有cookie复制到SharedPreferences中。 - Knossos
4个回答

31
你可以按照 @Emmanuel 建议的做法,或者在创建 HttpClients 时传递 BasicHttpContext

使用上下文和 cookies 的示例,完整代码请参考此处

    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);

谢谢提供的信息,这似乎是我最好的选择。 - Knossos

22

不要创建新的HttpClients; 这将清除cookies。重复使用一个单一的HttpClient。


那我可以将HttpClient设为静态吗? - Senthil
@vsk:是的。例如,您可以使用单例模式。我通常创建一个ConnectionHelper单例,在其中可以将请求序列化到服务器。 - Emmanuel

4
使您的httpClient成为一个单例类。

4
在Application类中定义HttpClient,并在Activity中使用。
在应用程序中:
public class AAA extends Application {
    public HttpClient httpClient; 

    httpClient = new DefaultHttpClient(); 

在Activity中

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

如果您使用此功能,请确保进行空值检查或使用AAA方法获取带有此检查的客户端,因为您无法控制应用程序的状态。 - DagW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接