虚拟机范围的 Cookie 管理是什么意思?



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

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

建立和维护 之间的潜在长期会话 客户端和服务器,HttpURLConnection包含一个可扩展的cookie 经理。使用 CookieHandler 启用虚拟机范围的 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,它按预期打印了饼干content/value。根据我的解释,我尝试在另一个活动中cookieManager.getCookieStore().getCookies().get(0).getValue();,但它无法识别对象,这意味着它超出了范围并且无法访问。此外,创建了一个新CookieManager并尝试获取cookie,但它返回null。因此,我认为这种对跨活动访问 VM 范围的解释是不正确的。

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

解决方案中建议如下的语句之一:

当 HttpURLConnection 收到来自服务器的 cookie 时, CookieManager 将接收 Cookie 并存储它。今后对以下情况提出的请求 同一服务器将自动发送先前设置的 cookie。

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

另一个困扰我的疑问:

存储 cookie 以供以后使用的大多数解决方案都建议使用SharedPreferences.困扰我的事情是他们最初都将饼干存储在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有什么意义呢?

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

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

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

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

相关内容

最新更新