我正在开发一款Android应用,我对此很陌生。我目前要做的是维护用户登录。要登录,我必须向API发出请求并发送用户电子邮件和密码,这将返回我管理得很好的JSONObject。我有一个 CookieStore 变量来获取Cookie并将其存储到我的 SharedPreferences 中。
我刚刚意识到我的 Cookie丢失如果我关闭应用程序并且我需要继续向API发出请求,即使应用程序已恢复,因为用户已经登录。我试图“恢复”我的一个活动的onResume()方法中的cookie,但这不符合我想要的方式。如果我在恢复我的应用程序之后尝试使用CookieStore.getCookies()来获取cookie,那么列表是 null 。
我被告知我可以使用loopj AsynHttpClient
并使用PersistentCookieStore
管理我的Cookie,但这不会让我遇到同样的问题吗?每次我恢复应用程序时,我都会丢失PersistentCookieStore实例的值,对吗?
所以我的问题是:
如何恢复Cookie以保持Cookie的持久性并让我能够继续向API发出请求?
希望任何人都可以帮助我。
提前致谢。
答案 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);
}
}