Okhttp传递cookie给Webview的解决方法
public class WebkitCookieProxy extends CookieManager implements CookieJar { private android.webkit.CookieManager mWebkitCookieManager; private static final String TAG = WebkitCookieProxy.class.getSimpleName(); public WebkitCookieProxy() { this(null, null); } WebkitCookieProxy(CookieStore store, CookiePolicy cookiePolicy) { super(store, cookiePolicy); this.mWebkitCookieManager = android.webkit.CookieManager.getInstance(); } @Override public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException{ // make sure our args are valid if ((uri == null) || (responseHeaders == null)) { return; } // save our url once String url = uri.toString(); // go over the headers for (String headerKey : responseHeaders.keySet()) { // ignore headers which aren't cookie related if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey .equalsIgnoreCase("Set-Cookie"))) { continue; } // process each of the headers for (String headerValue : responseHeaders.get(headerKey)) { mWebkitCookieManager.setCookie(url, headerValue); } } } @Override public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException { // make sure our args are valid if ((uri == null) || (requestHeaders == null)) { throw new IllegalArgumentException("Argument is null"); } // save our url once String url = uri.toString(); // prepare our response Map<String, List<String>> res = new java.util.HashMap<String, List<String>>(); // get the cookie String cookie = mWebkitCookieManager.getCookie(url); // return it if (cookie != null) { res.put("Cookie", Arrays.asList(cookie)); } return res; } @Override public CookieStore getCookieStore() { // we don't want anyone to work with this cookie store directly throw new UnsupportedOperationException(); } @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { HashMap<String, List<String>> generatedResponseHeaders = new HashMap<>(); ArrayList<String> cookiesList = new ArrayList<>(); for (Cookie c : cookies) { // toString correctly generates a normal cookie string cookiesList.add(c.toString()); } generatedResponseHeaders.put("Set-Cookie", cookiesList); try { put(url.uri(), generatedResponseHeaders); } catch (IOException e) { Log.e(TAG, "Error adding cookies through okhttp", e); } } @Override public List<Cookie> loadForRequest(HttpUrl url) { ArrayList<Cookie> cookieArrayList = new ArrayList<>(); try { Map<String, List<String>> cookieList = get(url.uri(), new HashMap<String, List<String>>()); // Format here looks like: "Cookie":["cookie1=val1;cookie2=val2;"] for (List<String> ls : cookieList.values()) { for (String s : ls) { String[] cookies = s.split(";"); for (String cookie : cookies) { Cookie c = Cookie.parse(url, cookie); cookieArrayList.add(c); } } } } catch (IOException e) { Log.e(TAG, "error making cookie!", e); } return cookieArrayList; } }
public static OkHttpClient createHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder().cookieJar(new WebkitCookieProxy());
return builder.build();
}