5

我正在尝试使用:拦截webview请求ShouldInterceptRequest,在其中我曾经HttpUrlConnection从服务器获取数据,我将其设置为遵循重定向,这对webviewclient是透明的。这意味着当我返回 WebResponseResource("", "", data_inputstream) 时,webview 可能不知道目标主机已更改。我怎么能告诉 webview 这发生了?

ourBrowser.setWebViewClient(new WebViewClient() {
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view,
                String url) {
                    ..... //some code omitted here

                HttpURLConnection conn = null;
                try {
                    conn = (HttpURLConnection) newUrl.openConnection();
                    conn.setFollowRedirects(true);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                   ..... //

                InputStream is = null;
                try {
                    is = conn.getInputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return new WebResourceResponse(mimeType, encoding, is);

            }
        }

如果我请求“google.com”,它应该被重定向到“google.co.uk”,但webview不知道重定向,如果附加“co.uk”的css文件的链接是“/render/something.css” ”,webview 仍然去“ http://www.google.com/render/something.css ”找到应该是“ http://www.google.co.uk/render/something.css ”的css文件”。

任何人都可以帮助我吗?

4

3 回答 3

1

类不能指定某些元数据(url、标题等)WebResourceResponse。这意味着您只能使用它shouldInterceptRequest来提供不同的数据(更改页面的内容),但不能使用它来更改正在加载的 URL。

在您的情况下,您正在使用 中的重定向HttpUrlConnection,因此 WebView 仍然认为它正在加载“ http://www.google.com/ ”(即使内容来自“ http://google.co.英国/ “)。如果 Google 的主页没有明确设置基本 URL,WebView 将继续假定基本 URL 是“ http://www.google.com/ ”(因为它没有看到重定向)。由于相对资源引用(如<link href="//render/something.css" />)是针对 baseURL(在本例中为“ http://www.google.com/ ”而不是“ http://www.google.co.uk/ ”)解析的,因此您将获得你观察到的结果。

您可以做的是HttpUrlConnection确定您要加载的 URL 是否是重定向并null在这种情况下返回。但是,我强烈建议不要使用HttpUrlConnectionfromshouldInterceptRequest一般 - WebView 的网络堆栈效率更高,并且将并行执行提取(而 usingshouldInterceptRequest将序列化 pre-KK WebViews 中的所有负载)。

于 2013-11-13T11:49:55.733 回答
0

关闭 HttpClientsetFollowRedirects(false)并让 webiew 重新加载重定向的 URL。

假代码:

if(response.code == 302){
  webview.load(response.head("location"));
}
于 2021-03-09T12:20:55.670 回答
-1

您可以为所有 HttpURLConnection 对象全局启用 HTTP 重定向:

HttpURLConnection.setFollowRedirects(true);

然后在shouldInterceptRequest()方法中检查连接响应代码:

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
  ...
  int respCode = conn.getResponseCode();
  if( respCode >= 300 && respCode < 400 ) {
    // redirect
    return null;
  } else if( respCode >= 200 && respCode < 300 ) {
    // normal processing
    ...
}

Android 框架应该使用新的 URL 再次调用shouldInterceptRequest()作为重定向目标,这次连接响应代码将是 2xx。

于 2014-12-31T15:52:27.863 回答