如何在WebViewClient.shouldInterceptRequest中把带有 "重定向 "代码的WebResourceResponse传递给Android WebView?

0 人关注

为了访问响应头(获得特定的头值),我们必须 intercept 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接受重定向响应吗?

PS.我能够用Java反射来解决这个问题,并将值直接注入到字段中(不是通过带有验证的ctor),但这似乎非常脆弱(尽管事实上它是有效的)。

java
android
http
webview
4ntoine
4ntoine
发布于 2020-01-29
2 个回答
active_liang
active_liang
发布于 2021-06-23
已采纳
0 人赞同

我遇到了同样的问题。

解决方案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;
    
Padge
Padge
发布于 2021-06-23
0 人赞同

正如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