如何使用OkHttp在Android上实现cookie处理?
通过Square https://github.com/square/okhttp使用OkHttp,我该如何:
- 检索从服务器返回的cookie
- 存储即将到来的请求的cookie
- 在随后的请求中使用存储的cookie
- 更新后续请求返回的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.CookieManager
, okhttp-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; } };