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

当我浏览Android文档时,遇到了以下语句:


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,并按预期方式打印了cookie content/value。根据我的解释,我在另一个 Activity 中尝试了cookieManager.getCookieStore().getCookies().get(0).getValue();,但是它无法识别该对象,这意味着该对象超出范围且不可访问。另外,创建了一个新的CookieManager并尝试获取cookie,但它返回了null。因此,我认为这种跨 Activity 范围可访问的VM范围的解释是不正确的。
  • 第二解释是设置CookieManager时,Cookie将自动存储。我是从另一个问题的解决方案中得到的:Cookie management with Java URLConnection

  • 解决方案中的其中一项陈述表明是这样的:



    我删除了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有什么意义呢?

    最佳答案

    可以在in this doc上找到有关Android Cookie管理框架的更多详细信息,但简而言之,您只需一次setDefault()。在随后的调用中,您可以使用CookieHandler.getDefault()并向 session 提供cookie,如this answer所示

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

    用最简单的术语来说,Android VM是将您的应用程序字节码转换为机器代码的层,并且每个应用程序是一个VM-因此,VM-Wide意味着Application作用域。

    SharedPrefs可用于在 session 之间持久化cookie,尽管这很少有用(只是我的看法)

    10-08 16:21