为什么在关闭Android应用程序时cookie会丢失?

时间:2014-08-15 15:48:55

标签: android cookies

我正在开发一款Android应用,我对此很陌生。我目前要做的是维护用户登录。要登录,我必须向API发出请求并发送用户电子邮件和密码,这将返回我管理得很好的JSONObject。我有一个 CookieStore 变量来获取Cookie并将其存储到我的 SharedPreferences 中。

我刚刚意识到我的 Cookie丢失如果我关闭应用程序并且我需要继续向API发出请求,即使应用程序已恢复,因为用户已经登录。我试图“恢复”我的一个活动的onResume()方法中的cookie,但这不符合我想要的方式。如果我在恢复我的应用程序之后尝试使用CookieStore.getCookies()来获取cookie,那么列表是 null

我被告知我可以使用loopj AsynHttpClient并使用PersistentCookieStore管理我的Cookie,但这不会让我遇到同样的问题吗?每次我恢复应用程序时,我都会丢失PersistentCookieStore实例的值,对吗?

所以我的问题是:

如何恢复Cookie以保持Cookie的持久性并让我能够继续向API发出请求?

希望任何人都可以帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您有两种选择:

选项1 - 如果使用SharedPreferences和HttpUrlConnection:您需要从SharedPreferences手动检索cookie,并在使用HttpUrlConnection时将cookie添加到每个请求。

选项2 - 如果使用loopj AsyncHttpClient:根据loopj文档,您必须创建PersistentCookieStore实例并在每次重新启动应用程序时将其添加到AsyncHttpClient,如此

AsyncHttpClient myClient = new AsyncHttpClient();
PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
myClient.setCookieStore(myCookieStore);

其中'this'是一个Context。

答案 1 :(得分:0)

如何将Cookie存储到SharedPreferences /从SharedPreferences恢复?你能分享一些代码吗? 您也可以尝试调试它并告诉我们它有什么问题吗?它是否存储到SharedPreferences?是否无法恢复它们?

在将CookieStore存储/恢复到SharedPreferences之前,您需要首先使用它创建一个Serializable对象,例如ArrayList<HashMap<String, String>

类似的东西:

public static void storeCookies(Context context, CookieStore cookieStore) {
  ArrayList<HashMap<String, String> cookies = new ArrayList<HashMap<String, String>();
  for (Cookie cookie : cookieStore.getCookies()) {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", cookie.getName());
    map.put("path", cookie.getPath());
    map.put("domain", cookie.getDomain());
    map.put("expiry_date", cookie.getExpiryDate());
    map.put("ports", cookie.getPorts());
    map.put("value", cookie.getValue());
    map.put("version", cookie.getVersion());
    ...
    // Add all the fields you want to save
    cookies.add(map);
  }

  SharedPreferences.Editor editor = context.getSharedPreferences().edit();
  editor.putSerializable("cookies", cookies).apply();
}

public static void addCookiesToStore(Context context, CookieStore cookieStore) {
  List<Map<String, String>> cookies = (ArrayList<HashMap<String, String>>) context.getSharedPreferences().getSerializable("cookies");

  for (Cookie map : cookieStore.getCookies()) {
    Cookie cookie = new BasicClientCookie(map.getName(), map.getValue());
    cookie.setPath(map.get("path));
    ...
    // Add all the fields you want to restore
    cookieStore.add(cookie);
  }
}