【发布时间】:2018-03-16 13:50:09
【问题描述】:
我正在学习在 Android 中存储 cookies 并遇到了几种实现方式。其中之一是使用CookieManager and CookieStore。
在浏览 Android 文档时,我发现了以下声明:
建立和维护一个潜在的长期会话 客户端和服务器,HttpURLConnection 包含一个可扩展的 cookie 经理。使用 CookieHandler 和 Cookie 管理器:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
我不明白VM-wide cookie management 的含义。我知道VM的意思是Virtual Machine。
我的解释:
-
我解释它的一种方式是,创建一个
CookieManager并将其传递给setDefault()使其在整个应用程序中可用。因此,我尝试了以下方法来测试它。URL url = new URL("http://something.com"); URI uri=new URI("http://something.com"); urlConnection = (HttpURLConnection) url.openConnection(); cks=urlConnection.getHeaderField("Set-Cookie"); //cks is a String cookieManager=new CookieManager(); CookieHandler.setDefault(cookieManager); HttpCookie hc=new HttpCookie("Cookie1",cks); cookieManager.getCookieStore().add(uri,hc); cks1=cookieManager.getCookieStore().getCookies().get(0).getValue(); //cks1 is another String我将
cks and cks1设置为TextViews并按预期打印 cookiecontent/value。根据我的解释,我在另一个活动中尝试了cookieManager.getCookieStore().getCookies().get(0).getValue();,但它无法识别该对象,这意味着它超出了范围且无法访问。此外,创建了一个新的CookieManager并尝试获取 cookie,但它返回了null。因此,我认为这种跨活动可访问 VM 范围的解释是不正确的。 第二个解释是 Cookie 将在设置
CookieManager时自动存储。我从 SO 上另一个问题的解决方案中得到它:Cookie management with Java URLConnection
解决方案中的陈述之一:
当 HttpURLConnection 接收到来自服务器的 cookie 时, CookieManager 将接收 cookie 并存储它。未来的请求 同一台服务器会自动发送之前设置的 cookie。
我删除了cookieManager.getCookieStore().add(uri,hc); 进行测试,发现cookie 不会自动存储。所以,这种解释也失败了。
困扰我的另一个疑问:
存储 cookie 以供以后使用的大多数解决方案都建议使用 SharedPreferences。困扰我的是,他们最初都将 cookie 存储在 CookieManager 中,然后将其移动到 SharedPreferences。为什么不直接使用SharedPreferences?
例如:
URL url = new URL("http://something.com");
urlConnection = (HttpURLConnection) url.openConnection();
cks=urlConnection.getHeaderField("Set-Cookie");
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
Editor editor = pref.edit();
editor.putString("cookie_name", cks); // Saving cookie
editor.commit();
那么使用CookieManager 然后将其移至SharedPreferences 有什么意义?
【问题讨论】:
-
"我尝试了 cookieManager...;在另一个活动中,但它无法识别该对象,这意味着它超出了范围并且无法访问" - 您有一个新实例,或者您尝试通过它访问它活动?有什么例外吗?
-
我尝试跨活动(同一个对象)访问它。
-
你大概有一个NPE?还是静态字段?
-
这是一个
static field:D -
好的,但我仍然不清楚“未识别对象”是什么意思。发布您看到的错误
标签: android cookies httpurlconnection android-sharedpreferences android-cookiemanager