gpt4 book ai didi

Android 正确拦截 WebView 请求

转载 作者:行者123 更新时间:2023-11-30 00:45:57 34 4
gpt4 key购买 nike

我目前在webview中拦截请求的代码是

 @Override
public WebResourceResponse shouldInterceptRequest(WebView view,
String url) {
String ext = MimeTypeMap.getFileExtensionFromUrl(url);
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
if (mime == null) {
return super.shouldInterceptRequest(view, url);
} else {
HttpURLConnection conn = (HttpURLConnection) new URL(
url).openConnection();
conn.setRequestProperty("User-Agent", userAgent);
return new WebResourceResponse(mime, "UTF-8",
conn.getInputStream());
}
}

我从 The best way to intercept a WebView request in Android .

但是,每当我尝试执行身份验证时,假设我正在我的 WebView 中加载 facebook。

mWebView.loadUrl("https://www.facebook.com/");

什么也没发生,我注意到,请求 header 和响应都不完整。此外,来源中没有 cookie。 (我在通过Chrome远程调试webview的时候看到了这个)。

如果我错了请纠正我,但我认为不完整的 header 和丢失的 cookie 是导致登录请求失败的原因。

有没有办法修改请求并设置其 header ?另外对于响应,我也应该这样做吗?最后,我将如何获得 cookie。

最佳答案

这个问题已经 6 个月没有得到回答,所以我不知道你是否还需要这个,但也许其他人有类似的问题。

request headers are incomplete

当使用 HttpURLConnection 时,您将负责设置您可能需要的任何请求 header ,但这就像设置 User-Agent 一样简单,您已经这样做了:conn.setRequestHeader (header, value) 或者如果您想添加而不是覆盖 header 值:conn.addRequestHeader(header, value)

或者,您可以使用 okhttp ,一个 HTTP 客户端,它应该为 header 添加通常预期的默认值。

there are no cookies in the Sources

拦截请求时,您还将负责处理 cookie。您可以通过解析响应中的 header 来手动存储 cookie,例如

    public WebResourceResponse shouldInterceptRequest(WebView view,
String url) {
// do your stuff
conn.connect(); // required to tell that the connection should be established
String cookie = getCookieFromConnection(conn);
// do more stuff and return WebResourceResponse
}

/**
* iterates all headers, and finds "cookie" headers
* (there could be more than one)
* @return cookie (concatenated value of all the found cookies)
* or null if no cookie has been found
*/
private String getCookieFromConnection(HttpURLConnection connection) {
String cookie = "";
Map<String, List<String>> header = connection.getHeaderFields();
List<String> cookies = header.get(COOKIE_HEADER);
if (cookies != null) {
for (String c : cookies) {
if (c != null) cookie += c + ";";
}
}
if (cookie.isEmpty()) return null;
return cookie;
}

或者您可以使用 CookieManager ,它将为您处理一切:

    cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

当使用 okhttp 时,您可能还需要处理您的 cookie,但同样您可以使用如上所述的 CookieManager。有关详细信息,请参阅此文档,或此 stackoverflow question .

Please correct me if I'm wrong, but I think that the incomplete headers and missing cookies is what causing the login request to fail.

还有另一个问题,当拦截 WebView 中的请求时:它以某种方式停止加载和评估 javascript。我找到了这个 blog by Artem Zinnatullin在线,谁描述了这种行为,我也经历过同样的行为。

如果有人对此有解决方案,我将非常高兴。

关于Android 正确拦截 WebView 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41807020/

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