【问题标题】:Android CookieManager setCookie doesn't set anythingAndroid CookieManager setCookie 没有设置任何东西
【发布时间】:2012-07-26 20:53:09
【问题描述】:

在我的应用程序中,我从 HttpGet 请求中获取了两个 cookie,并将它们存储在 CookieManager 中,如下所示:

//Clear old cookies
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
        CookieManager.getInstance().setCookie("http://alpha.mydomainname.com", cookieString);
    }

    System.out.println(CookieManager.getInstance().hasCookies()); //Prints false in 2.3,  true in 4.0.3

    CookieSyncManager.getInstance().sync();

    System.out.println(CookieManager.getInstance().hasCookies()); //Also prints false in 2.3 and true in 4.0.3
}

我正在两个不同的设备上测试相同的代码,有趣的是,cookie 在 4.0.3 中正确设置(并且还在应用程序的启动之间传输),但在 2.3.3 中没有。当我说它们未设置时,我的意思是当我提供 URL 时 hasCookies() 返回 false 并且 getCookie() 返回 null。

在调用 setCookie 时,我已经尝试了 Cookie URL 的所有可能组合:“http://alpha.mydomainname.com”、“http://www.mydomainname.com”、“http://mydomainname.com” "、"mydomainname.com"、"alpha.mydomainname.com"、".mydomainname.com"、"www.mydomainname.com",它们都不起作用。请帮忙。

【问题讨论】:

  • 你有没有得到这个工作?我现在遇到了同样的问题......
  • 我需要再试几次才能确定,但​​我发现类似以下内容:如果设置了 Expires 标头,则 cookie 保存在 2.3.3 而不是 4.0.4,而如果Expires 缺少 4.0.4 上保存的 cookie,但 2.3.3 上没有。
  • 您的问题解决了吗?我在这里也面临同样的情况......
  • 另见stackoverflow.com/questions/1652850/…。就我而言,我将常用的 URL (https://example.com/) 写为域。在某些情况下,最好设置为.example.com

标签: android cookies


【解决方案1】:

我还遇到了CookieManager 的一些奇怪行为,最终我找到了一个解决方案,它是一种变通方法 - 但它确实有效。
我没有使用CookieManager,而是使用了http cookie标头,因此例如使用HttpUrlConnection,它可能看起来像这样:

//Save the two cookies: auth token and session info
List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
    String cookieString = cookie.getName() + "=" + cookie.getValue();
    myHttpURLConnection.setRequestProperty("Cookie", cookieString);
}

当然,如果您需要保留这些 cookie,您将不得不自己做,并将它们的值保存在某个地方以备后用...

【讨论】:

    【解决方案2】:

    我最近遇到了类似的问题,以下解决方案对我有用。我在开始时创建/获取 CookieSyncManager 和 CookieManager 的实例,并在整个代码中使用它们,而不是再次创建新实例。我还必须尝试在正确的域上设置 cookie - 我必须将其设置为出现在重定向之一中的域。

    final CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);
    final CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();
    
    //Save the two cookies: auth token and session info
    List<Cookie> cookies = httpclient.getCookieStore().getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
            cookieManager.setCookie("http://mydomainname.com", cookieString);
        }
        cookieSyncManager.sync();
    }
    

    【讨论】:

      【解决方案3】:

      我找到了一个使用后台线程来设置 cookie 的插件。

      iOS 9Android 5 上测试:

      https://github.com/kristianhristov/cordova-cookie-master

      【讨论】:

        【解决方案4】:

        cookie不能包含分号,因为分号表示int cookie的分隔符。

        【讨论】:

          【解决方案5】:

          我也遇到过同样的问题。尚不清楚如何使用setCookie 方法。如果您的 cookie 项目很少(比如我的情况),您应该使用一些循环来使用它:

          val cookies = "key1=someValue1;key2=someValue2;key3=someValue3"
          val cookiesList = cookies.split(";")
          cookiesList.forEach { item ->
           CookieManager.getInstance().setCookie("http://someHost.com", item)
          }
          

          所以你不能像这样使用它:

          CookieManager.getInstance().setCookie("http://someHost.com", "key1=someValue1;key2=someValue2;key3=someValue3")
          

          【讨论】:

          • 谢谢。这是真的
          猜你喜欢
          • 1970-01-01
          • 2014-06-19
          • 1970-01-01
          • 2017-05-18
          • 1970-01-01
          • 2014-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多