gpt4 book ai didi

android - OkHTTPClient 将 cookie 传递给 Webview

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:48 25 4
gpt4 key购买 nike

我正在通过 OKHttpClient 帖子以用户身份登录,我想与 webview 共享 cookie。

最佳答案

在 OkHttp 3.0 中,您可以通过创建一个使用 webkit cookie 存储的 WebkitCookieManagerProxy 来使用类似于与 HttpURLConnection 共享的方法。改编自 Pass cookies from HttpURLConnection (java.net.CookieManager) to WebView (android.webkit.CookieManager) .

public class WebkitCookieManagerProxy extends CookieManager implements CookieJar {
private android.webkit.CookieManager webkitCookieManager;

private static final String TAG = WebkitCookieManagerProxy.class.getSimpleName();

public WebkitCookieManagerProxy() {
this(null, null);
}

WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) {
super(null, cookiePolicy);
this.webkitCookieManager = 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)) {
webkitCookieManager.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 = webkitCookieManager.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;
}

}

然后在构建 OkHttpClient 时添加一个代理实例作为您的 cookieJar。

client = new OkHttpClient.Builder().cookieJar(proxy).build();

关于android - OkHTTPClient 将 cookie 传递给 Webview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34663640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com