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

Mat*_*hai 8 cookies android httpurlconnection android-cookiemanager android-sharedpreferences

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

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

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

CookieManager cookieManager = new CookieManager();  
CookieHandler.setDefault(cookieManager);
Run Code Online (Sandbox Code Playgroud)

我不明白的意思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
    
    Run Code Online (Sandbox Code Playgroud)

    我设置cks and cks1TextViews并按content/value预期打印cookie .根据我的解释,我尝试cookieManager.getCookieStore().getCookies().get(0).getValue();了另一个活动,但它没有识别出对象,这意味着它超出了范围而且无法访问.此外,创建了一个新的,CookieManager并尝试获取cookie,但它返回null.因此,我假设可以跨活动访问VM范围的这种解释是不正确的.

  2. 第二个解释是Cookies将在CookieManager设置时自动存储.我从SO的另一个问题的解决方案中得到了它:使用Java URLConnection进行Cookie管理

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

当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();
Run Code Online (Sandbox Code Playgroud)

那么使用CookieManager它然后将它移动到SharedPreferences什么地步呢?

Nic*_*oso 4

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

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

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

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