如何使用OkHttp在Android上实现cookie处理?

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

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

理想情况下,Cookie将被存储,重新发送和每个请求自动更新。

对于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 okhttp-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(); 

Pre OkHttp 3 ,您可以将CookieHandler传递给您的OkHttpClient实例。 您可以使用java.net中的CookieManager实现,也可以实现自己的想法。 select最适合您需求的政策。

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

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

我需要分享默认的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; } };