VM广泛的cookie管理意味着什么?

时间:2018-03-16 13:50:10

标签: android cookies httpurlconnection android-sharedpreferences android-cookiemanager

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

当我浏览Android文档时,我发现了以下声明:

  

建立并维持一个可能长期存在的会话   客户端和服务器,HttpURLConnection包含一个可扩展的cookie   经理。使用CookieHandler和。启用VM范围的cookie管理   CookieManager:

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。因此,我假设可以跨活动访问虚拟机范围的这种解释是不正确的。

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

  3. 解决方案中的一个陈述如下:

      

    当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有什么意义呢?

1 个答案:

答案 0 :(得分:4)

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

中所示

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

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

SharedPrefs可以用来在会话之间保留cookie,虽然这应该很少有用(只是我的意见)