Android WebViewClient网址重定向(Android网址加载系统)

时间:2013-08-14 16:39:28

标签: android redirect webview webviewclient android-webview

我尝试使用ShouldInterceptRequest拦截webview请求,在其中我使用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”,但是如果附带“co.uk”的css文件的链接是“/ render /”,webview就不知道重定向something.css“,webview仍然转到”http://www.google.com/render/something.css“找到应该是”http://www.google.co.uk/render/something.css“的css文件。

任何人都可以帮助我?

3 个答案:

答案 0 :(得分:0)

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

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

您可以使用HttpUrlConnection确定您要加载的网址是否为重定向,并在此情况下返回null。但是我强烈建议不要使用来自HttpUrlConnection的{​​{1}} - WebView的网络堆栈效率更高并且将并行执行提取(而使用shouldInterceptRequest将序列化所有负载pre-KK WebViews)。

答案 1 :(得分:0)

关闭 HttpClient setFollowRedirects(false) 并使 webiew 重新加载重定向的 URL。

假代码:

if(response.code == 302){
  webview.load(response.head("location"));
}

答案 2 :(得分:-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。