8

我正在学习cookies在 Android 中存储,并遇到了几种实现它的方法。其中之一是使用CookieManager and CookieStore.

在浏览 Android 文档时,我遇到了以下声明:

为了在客户端和服务器之间建立和维护一个潜在的长期会话,HttpURLConnection 包括一个可扩展的 cookie 管理器。使用 CookieHandler 和 CookieManager 启用 VM 范围的 cookie 管理:

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);

我不明白 的意思VM-wide cookie management。我知道 VM 的意思是Virtual Machine.

我的解释:

  1. 我解释它的一种方式是,创建一个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打印cookie 。content/value根据我的解释,我尝试cookieManager.getCookieStore().getCookies().get(0).getValue();了另一个活动,但它无法识别该对象,这意味着它超出了范围且无法访问。此外,创建了一个新的CookieManager并试图获取 cookie 但它返回了null。因此,我认为这种对跨活动可访问 VM 范围的解释是不正确的。

  2. 第二个解释是 Cookies 会在CookieManager设置时自动存储。我从另一个关于 SO 的问题的解决方案中得到了它:Cookie management with Java URLConnection

解决方案中的陈述之一是这样建议的:

当 HttpURLConnection 接收到来自服务器的 cookie 时,CookieManager 将接收 cookie 并存储它。未来对同一服务器的请求将自动发送先前设置的 cookie。

我删除cookieManager.getCookieStore().add(uri,hc);以测试它,发现 cookie 不会自动存储。所以,这种解释也失败了。

另一个困扰我的疑问:

大多数存储 cookie 以供以后使用的解决方案都建议使用SharedPreferences. 困扰我的事情是,它们CookieManager最初都将 cookie 存储在其中,然后将其移至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呢?

4

1 回答 1

4

有关 Android cookie 管理框架的更多详细信息可以在此文档中找到,但简而言之,您只需要做setDefault()一次。在随后的调用中,您可以使用CookieHandler.getDefault()并将 cookie 提供给会话,如本答案所示

使用默认实现,您将只能从您自己的应用程序访问 cookie。

简而言之,Android VM 是将您的应用程序字节码转换为机器代码的层,它是每个应用程序一个 VM - 因此 VM-Wide 意味着应用程序范围。

SharedPrefs 可用于在会话之间保留 cookie,尽管这应该很少有用(只是我的看法)

于 2018-03-26T08:07:19.603 回答