如何使用cookieManager在httpUrlConnection中处理cookie

Dav*_*vid 36 cookies android httpurlconnection android-cookiemanager

我有一个返回多个cookie的服务器请求,如下所示:

在此输入图像描述

这就是我将这些cookie存储到cookieManager的方式:

HttpURLConnection connection = ... ;
static java.net.CookieManager msCookieManager = new java.net.CookieManager();
msCookieManager.put(COOKIES_URI, connection.getHeaderFields());
Run Code Online (Sandbox Code Playgroud)

这就是我将这些cookie添加到下一个连接的方式:

connection.setRequestProperty("Cookie", 
  msCookieManager.getCookieStore().get(COOKIES_URI).toString());
Run Code Online (Sandbox Code Playgroud)

它是从cookieManager获取cookie的正确方法吗?我很确定有一个更好的...

Dav*_*vid 102

好的,正确的方法是这样的:

从响应头获取Cookie并将其加载到cookieManager中:

static final String COOKIES_HEADER = "Set-Cookie";
HttpURLConnection connection = ... ;
static java.net.CookieManager msCookieManager = new java.net.CookieManager();

Map<String, List<String>> headerFields = connection.getHeaderFields();
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);

if (cookiesHeader != null) {
    for (String cookie : cookiesHeader) {
        msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0));
    }               
}
Run Code Online (Sandbox Code Playgroud)

从cookieManager获取Cookie并将其加载到连接中:

if (msCookieManager.getCookieStore().getCookies().size() > 0) {
    // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';'
    connection.setRequestProperty("Cookie",
    TextUtils.join(";",  msCookieManager.getCookieStore().getCookies()));    
}
Run Code Online (Sandbox Code Playgroud)

  • +1当使用多个cookie时,我更幸运地使用分号:`TextUtils.join(";",msCookieManager.getCookieStore().getCookies()));` (2认同)
  • 哇哥们!当这是处理我的登录会话的正确方法时,我一直在尝试使用http keepalive/httpurlconnection持久连接.谢谢你的回答! (2认同)
  • 此代码不可能正确,因为它会发送您拥有的所有站点的所有 cookie。不仅是那些属于服务器的设置,而是所有的设置。这是安全问题。 (2认同)

Gol*_*umb 44

我一直在寻找/尝试几天来解决我的问题:即使在成功登录后也无法访问受保护的Web资源

我在iOS上创建了相同的应用程序并且没有相同的问题,因为NSUrlConnection在幕后为我们做了cookie维护.在Android上,我尝试手动添加cookie

connection.setRequestProperty("Cookie", "PHPSESSID=str_from_server")
Run Code Online (Sandbox Code Playgroud)

没有运气.

最后我读了这个

并在我的应用程序开头的某处添加了以下2行:

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

现在一切正常.

  • 非常感谢,只需要那些2行yay ^ _ ^,尝试其他答案也都有效但这一个更方便 (2认同)
  • 这应该是公认的答案。我尝试手动处理 cookie,但没有成功。这两行正是您使用 HttpUrlConnection 处理 cookie 所需要的!感谢金拇指! (2认同)
  • @HeisenBerg可以放置在任何地方,只要执行一次即可,并且在您第一次使用HttpURLConnection之前。 (2认同)