【问题标题】:How to make persistent Cookies with a DefaultHttpClient in Android?如何在 Android 中使用 DefaultHttpClient 制作持久 Cookie?
【发布时间】:2011-02-20 22:58:42
【问题描述】:

我正在使用

// this is a DefaultHttpClient
List<Cookie> cookies = this.getCookieStore().getCookies();

现在,由于 Cookie 没有实现可序列化,我无法序列化该 List。

编辑:(指定我的目标,不仅仅是问题)

我的目标是将 DefaultHttpClient 与持久性 cookie 一起使用。

有经验的人可以带领我走上正确的道路吗?可能还有另一个我没有发现的最佳实践......

【问题讨论】:

    标签: java android http


    【解决方案1】:

    Android 异步 Http 库支持自动持久化 cookie 存储到 SharedPreferences:

    http://loopj.com/android-async-http/

    如果您仍想使用 DefaultHttpClient,您也可以提取并使用 PersistentCookieStore.java 和 SerializableCookie.java 类。

    【讨论】:

      【解决方案2】:

      创建您自己的SerializableCookie 类,其中implements Serializable 并在其构造过程中复制Cookie 属性。像这样的:

      public class SerializableCookie implements Serializable {
      
          private String name;
          private String path;
          private String domain;
          // ...
      
          public SerializableCookie(Cookie cookie) {
              this.name = cookie.getName();
              this.path = cookie.getPath();
              this.domain = cookie.getDomain();
              // ...
          }
      
          public String getName() {
              return name;
          }
      
          // ...
      
      }
      

      确保所有属性本身也是可序列化的。除了原语之外,String 类本身已经 implements Serializable,所以你不必担心。

      或者,您也可以将Cookie 包装/装饰为transient 属性(这样它就不会被序列化)并覆盖writeObject()readObject() 方法accordingly。比如:

      public class SerializableCookie implements Serializable {
      
          private transient Cookie cookie;
      
          public SerializableCookie(Cookie cookie) {
              this.cookie = cookie;
          }
      
          public Cookie getCookie() {
              return cookie;
          }
      
          private void writeObject(ObjectOutputStream oos) throws IOException {
              oos.defaultWriteObject();
              oos.writeObject(cookie.getName());
              oos.writeObject(cookie.getPath());
              oos.writeObject(cookie.getDomain());
              // ...
          }
      
          private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
              ois.defaultReadObject();
              cookie = new Cookie();
              cookie.setName((String) ois.readObject());
              cookie.setPath((String) ois.readObject());
              cookie.setDomain((String) ois.readObject());
              // ...
          }
      
      }
      

      最后在List 中使用该类。

      【讨论】:

      • 谢谢,我认为这可能有效,但我希望有更简单的方法来实现我的目标。我希望 SDK 中有一些现成的功能,所以我不必再次发明轮子,但由于它是 Java,我可能不得不这样做。我认为使用持久性 cookie 是典型的问题。对不起,我的问题一开始有点不清楚,但我已经更新了。不管怎样,我很感谢你的建议。
      • 不序列化真正的 cookie 是有意义的,因为它们代表的状态在您反序列化时可能无效。只需将它们保存在内存中或仅将名称/值对存储在 Map 中并对其进行序列化即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 2011-02-20
      相关资源
      最近更新 更多