如何使用 Retrofit/OkHttpClient 从响应中获取多个 Set-Cookie 标头? [英] How to get more than one Set-Cookie header from response using Retrofit/OkHttpClient?

查看:161
本文介绍了如何使用 Retrofit/OkHttpClient 从响应中获取多个 Set-Cookie 标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 Android 上使用 Retrofit/OkHttpClient 进行身份验证调用.服务器使用两个 Set-Cookie 标头响应 302,并且 okHttp 处理重定向.我找到了一些使用 cookieManager 获取这些 cookie 的技巧.但似乎 cookieManager 只读取一个 Set-Cookie 标头.

I'm trying to make an authentication call using Retrofit/OkHttpClient on Android. The server responds a 302 with two Set-Cookie headers and okHttp handles redirection. I found some tips to get those cookies using cookieManager. But it seems cookieManager reads only one Set-Cookie header.

我在服务器响应头中有这个:

I have this in server response headers:

Set-Cookie:first=1
Set-Cookie:second=2

这是我的 cookieManager 部分:

This is my cookieManager part:

private static CookieManager cookieManager;
(...)
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setFollowSslRedirects(true);
okHttpClient.setAuthenticator(new NTLMAuthenticator(user, passwd, domain));

cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
okHttpClient.setCookieHandler(cookieManager);

并处理 Set-Cookie 标头:

And handling Set-Cookie headers:

public void checkForSetCookies() {
    List<retrofit.client.Header> headerList = new ArrayList<>();
    List <HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
    //List cookies has only one cookie:  first=1
    for (HttpCookie cookie : cookies) {
        retrofit.client.Header header = new retrofit.client.Header("Set-Cookie", cookie.toString());
        headerList.add(header);
    }

    if (headerList.size() > 0) {
        Commons.setLoginRetofitCookies(headerList);
    }
}

有没有办法强制 cookieManager 读取我的两个 Set-Cookie 标头?

Is there a way to force cookieManager to read both of my Set-Cookie headers?

提前感谢您的帮助.

推荐答案

我想我解决了这个问题.CookieManager 类正在解析响应标头以列出:

I think I solved the problem. CookieManager class is parsing response headers to list:

List<HttpCookie> cookies = parseCookie(responseHeaders);

因此,第二个 cookie 被覆盖.

so as a result the second cookie is overwritten.

我决定创建 MyCookieManager 内部类并覆盖其 put 方法以将 cookie 值放入字符串列表.我调用 super 方法来进行所有标头验证.

I decided to create MyCookieManager inner class and override its put method to put cookies values to list of Strings. I call super method to do all headers validation.

class MyCookieManager extends CookieManager {

    @Override
    public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException {
        super.put(uri, stringListMap);
        if (stringListMap != null && stringListMap.get("Set-Cookie") != null)
            for (String cookieValue: stringListMap.get("Set-Cookie")) {
                cookiesStrings.add(cookieValue);
            }
    }
}

现在一切正常:)

这篇关于如何使用 Retrofit/OkHttpClient 从响应中获取多个 Set-Cookie 标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆