Android OkHTTPClient将cookies传递给Webview

Android OkHTTPClient将cookies传递给Webview,android,webview,okhttp,Android,Webview,Okhttp,我正在通过OKHttpClient帖子以用户身份登录,我想与webview共享cookies。此链接有帮助,但我必须为我的用例修改一些内容: 以下代码有效: webView = (WebView) findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); //enable javascript... webSettings.setJavaScriptEnabled(true); webVi

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

此链接有帮助,但我必须为我的用例修改一些内容:

以下代码有效:

webView = (WebView) findViewById(R.id.webView);    
WebSettings webSettings = webView.getSettings();

//enable javascript...
webSettings.setJavaScriptEnabled(true);

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        progress.dismiss();
    }

    @SuppressWarnings("deprecation")
    @Override
    public WebResourceResponse shouldInterceptRequest(@NonNull WebView view, @NonNull String url) {
        return handleRequestViaOkHttp(url);
    }
});

webView.loadUrl("MY_URL.COM");
然后执行基本auth+的代码使用OkHTTPClient处理拦截webview请求

@NonNull
private WebResourceResponse handleRequestViaOkHttp(@NonNull String url) {
    try {
        OkHttpClient client = new OkHttpClient();

        client.setAuthenticator(new Authenticator() {

            //for basic authorization...
            @Override
            public Request authenticate(Proxy proxy, com.squareup.okhttp.Response response) throws IOException {
                String credential = Credentials.basic(CommonResource.HEADER_USERNAME, CommonResource.HEADER_PASSWORD);
                return response.request().newBuilder().header("Authorization", credential).build();
            }

            @Override
            public Request authenticateProxy(Proxy proxy, com.squareup.okhttp.Response response) throws IOException {
                return null;
            }
        });

        final Call call = client.newCall(new Request.Builder()
            .url(url)
            .build()
        );

        final Response response = call.execute();

        return new WebResourceResponse("text/html", "UTF-8", response.body().byteStream());
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

使用OkHttp 3.0,您可以通过制作使用webkit cookie存储的WebkitCookieManagerProxy,使用类似于与HttpURLConnection共享的方法。改编自


如果您只关心
OkHttp+WebView
,那么就可以这么简单:

class WebkitCookieManager (private val cookieManager: CookieManager) : CookieJar {

    override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
        cookies.forEach { cookie ->
            cookieManager.setCookie(url.toString(), cookie.toString())
        }
    }

    override fun loadForRequest(url: HttpUrl): List<Cookie> =
        when (val cookies = cookieManager.getCookie(url.toString())) {
            null -> emptyList()
            else -> cookies.split("; ").mapNotNull { Cookie.parse(url, it) }
        }
}

....


Usage:
 1. OkHttp
OkHttpClient.Builder().cookieJar(webkitCookieManager)

 2. WebView
CookieManager.getInstance().setCookie()

类WebkitCookieManager(私有val cookieManager:cookieManager):CookieJar{
覆盖趣味saveFromResponse(url:HttpUrl,cookies:List){
cookies.forEach{cookie->
cookieManager.setCookie(url.toString(),cookie.toString())
}
}
覆盖fun loadForRequest(url:HttpUrl):列表=
当(val cookies=cookieManager.getCookie(url.toString())){
null->emptyList()
else->cookies.split(“;”).mapNotNull{Cookie.parse(url,it)}
}
}
....
用法:
1.OkHttp
OkHttpClient.Builder().cookieJar(webkitCookieManager)
2.网络视图
CookieManager.getInstance().setCookie()

如果未使用,则无需支持
HttpURLConnection

您的问题是?如果是“我该怎么做?”,那就太宽泛了。如果是“我在哪里可以找到这样做的教程?”,也将关闭。你有什么特别的问题吗?尽管这里有一个简短的描述问题很清楚,但也有一个重复的问题:如果有人想在代码中附加信息以允许在现有表单上发布信息,那就太酷了:)这不是一个好主意,请参阅。拦截webview网络请求会使它们在chrome 47之前按顺序执行,5.0之前的Android客户端不会更新其web视图。如何将上述内容与PersistentCookieStore一起使用?@Elye您是否找到了与
PersistentCookieStore
?@snachmsm合作的方法,您可以查看谢谢,我已经找到了这篇文章,但在生产环境中仍然面临一些问题…:(我正在或正在使用
PersistenCookieJar
PersistentCookieStore
,内置
CookieSyncManager
CookieManager
CookieMandler
,可能还有其他一些方法(例如延迟同步时间)一个沮丧的用户说每一次应用更新都在清除他的cookies(Mate 10 Pro,9.0),而且我在crashlytics中看到,每周很少有用户不获取cookie,但sysadmin说服务器端没有问题。我从未复制过这两种行为……请记住,如果您没有使用
HttpURLConnection
OkHttp+WebView
唯一版本,则此代码的一半是不需要的:
client = new OkHttpClient.Builder().cookieJar(proxy).build();
class WebkitCookieManager (private val cookieManager: CookieManager) : CookieJar {

    override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
        cookies.forEach { cookie ->
            cookieManager.setCookie(url.toString(), cookie.toString())
        }
    }

    override fun loadForRequest(url: HttpUrl): List<Cookie> =
        when (val cookies = cookieManager.getCookie(url.toString())) {
            null -> emptyList()
            else -> cookies.split("; ").mapNotNull { Cookie.parse(url, it) }
        }
}

....


Usage:
 1. OkHttp
OkHttpClient.Builder().cookieJar(webkitCookieManager)

 2. WebView
CookieManager.getInstance().setCookie()