53

使用 Square https://github.com/square/okhttp的 OkHttp ,我该如何:

  1. 检索从服务器返回的 cookie
  2. 为即将到来的请求存储 cookie
  3. 在后续请求中使用存储的 cookie
  4. 更新后续请求返回的cookie

理想情况下,cookie 会随每个请求自动存储、重新发送和更新。

4

3 回答 3

71

对于 OkHttp3,一个简单的全接受、非持久化CookieJar实现可以如下:

OkHttpClient client = new OkHttpClient.Builder()
    .cookieJar(new CookieJar() {
        private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            cookieStore.put(url, cookies);
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            List<Cookie> cookies = cookieStore.get(url);
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    })
    .build();

或者,如果您更喜欢使用java.net.CookieManagerokhttp-urlconnection请在您的项目中包含JavaNetCookieJar一个包装类,该包装类委托给java.net.CookieHandler

dependencies {
    compile "com.squareup.okhttp3:okhttp:3.0.0"
    compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0"
}

CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
OkHttpClient client = new OkHttpClient.Builder()
    .cookieJar(new JavaNetCookieJar(cookieManager))
    .build();
于 2016-01-12T14:25:18.133 回答
34

在 OkHttp 3 之前,您可以将 CookieHandler 传递给 OkHttpClient 实例。您可以使用 java.net 中的 CookieManager 实现,也可以根据需要实现自己的。选择最适合您需求的政策。

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

OkHttp 将从 Responses 接收到的 cookie 保存到 CookieHandler 中,并在发送请求时从中读取。它将这样做以匹配请求/响应 URI。

于 2014-06-17T14:56:40.420 回答
9

我需要共享默认的 Cookie Jar (CookieManager.getInstance()),所以这对我来说似乎没问题。

return new CookieJar() {

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            CookieManager cookieManager = CookieManager.getInstance();

            for (Cookie cookie : cookies) {
                cookieManager.setCookie(url.toString(), cookie.toString());
            }
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            CookieManager cookieManager = CookieManager.getInstance();
            List<Cookie> cookies = new ArrayList<>();
            if (cookieManager.getCookie(url.toString()) != null) {
                String[] splitCookies = cookieManager.getCookie(url.toString()).split("[,;]");
                for (int i=0; i<splitCookies.length; i++) {
                    cookies.add(Cookie.parse(url, splitCookies[i].trim()));
                }
            }
            return cookies;
        }
    };
于 2017-06-14T07:49:44.310 回答