如何在 WebViewClient.shouldInterceptRequest 中将带有"redirect"代码的 WebResourceResponse 传递给 Android WebView?



为了访问响应标头(获取特定的标头值(,我们必须在WebView中拦截HTTP请求,自己执行HTTP资源的下载,并以WebResourceResponse实例的形式返回结果:

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
{
return new WebResourceResponse("text/plain", "UTF-8", 302, ...); // 302 is invalid (not supported) value
}

但是,不接受 300-399 范围内的代码:

2019-12-02 16:48:05.710 1812-1903 W/System.err: java.lang.IllegalArgumentException: statusCode can't be in the [300, 399] range.
2019-12-02 16:48:05.712 1812-1903 W/System.err:     at android.webkit.WebResourceResponse.setStatusCodeAndReasonPhrase(WebResourceResponse.java:134)
2019-12-02 16:48:05.712 1812-1903 W/System.err:     at android.webkit.WebResourceResponse.<init>(WebResourceResponse.java:76)
...
2019-12-02 16:48:05.714 1812-1903 W/System.err:     at xl.a(PG:56)
2019-12-02 16:48:05.714 1812-1903 W/System.err:     at aeW.a(PG:9)
2019-12-02 16:48:05.714 1812-1903 W/System.err:     at org.chromium.android_webview.AwContentsBackgroundThreadClient.shouldInterceptRequestFromNative(PG:11)
2019-12-02 16:48:05.718 1812-1903 A/chromium: [FATAL:jni_android.cc(256)] Please include Java exception stack in crash report

是否有任何正确的方法可以使 WebView 接受重定向响应?

附言。我能够使用 Java 反射来解决它并将值直接注入到字段中(不是通过带有验证的 ctor(,但它似乎非常脆弱(尽管它实际上有效(。

我遇到了同样的问题。

解决方案 1:加载新网址

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String statusCode = 302; //get it from your response;
if (statusCode >= 300 && statusCode <= 399) {
final String newUrl = "https://example.com";
final myWebview = view;
view.post(new Runnable() {
@Override public void run() {
myWebview.loadUrl(newUrl);
}
});
WebResourceResponse nullRes = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream("".getBytes()));
return nullRes;
}
}

解决方案 2:返回 html 模板

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String statusCode = 302; //get it from your response;
if (statusCode >= 300 && statusCode <= 399) {
String newUrl = "https://example.com";
String content = "<script>location.href = '" + newUrl + "'</script>";
WebResourceResponse redirectRes = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(content.getBytes()));
return redirectRes;
}
}

正如OP所说,他们能够通过使用反射来解决这个限制。另一个答案不足以满足我的需求,所以我也采取了反思的方法。

// instantiate a response with a default 200 response code
WebResourceResponse redirectResponse = new WebResourceResponse("text/html", "utf-8", 200, new ByteArrayInputStream(content.getBytes()));
// use reflection to set the actual response code
Field f = WebResourceResponse.class.getDeclaredField("mStatusCode");
f.setAccessible(true);
f.setInt(redirectResponse, 302);
return redirectResponse;

相关内容

  • 没有找到相关文章

最新更新