【问题标题】:What does it mean by VM wide cookie management?VM 范围的 cookie 管理是什么意思?
【发布时间】:2018-03-16 13:50:09
【问题描述】:

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

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

解决方案中的陈述之一:

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

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

【问题讨论】:

  • "我尝试了 cookieManager...;在另一个活动中,但它无法识别该对象,这意味着它超出了范围并且无法访问" - 您有一个新实例,或者您尝试通过它访问它活动?有什么例外吗?
  • 我尝试跨活动(同一个对象)访问它。
  • 你大概有一个NPE?还是静态字段?
  • 这是一个static field:D
  • 好的,但我仍然不清楚“未识别对象”是什么意思。发布您看到的错误

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


【解决方案1】:

更多关于Android cookie管理框架的细节可以看in this doc,但总之你只需setDefault()一次。在随后的调用中,您可以使用CookieHandler.getDefault() 并将cookie 提供给会话,如this answer 中所示

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

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

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

【讨论】:

  • 知道了:D 非常感谢,尼克。 One VM per application 完成它。另外,default CookieManager 是在重新启动应用程序时保存和恢复,还是每次都是新实例?
  • 相信你每次都需要设置实例
  • 是的,你仍然需要,只是简单一点(无需担心对象格式)。我会改写我的答案,因为那是一个错误
  • 完成 :D 以为是自动的。
  • 我想很多人都这么认为,但事实并非如此——如果你得到一个高分但不奖励的答案,系统奖励一半
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2010-09-06
  • 2015-01-10
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多