android WebView拦截请求详解

原创 2016年08月29日 11:21:09

1、WebView基本用法

WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限。我也简单了写了一个加载百度的,如下图
这里写图片描述
代码如是:

 mWebview = (WebView) findViewById(R.id.my_webview);
 mWebview.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return false;
            }
        });
mWebview.loadUrl("https://www.baidu.com/");

这是WebView最简单的使用了。

2 、WebView拦截请求

WebView调用loadUrl后,会首先根据传入的URL获取响应,然后再将响应显示到页面上,这就是WebView的原理。那么我们可以在获取响应过程中重新改变请求URL或者直接将响应替换。而具体的替换在WebViewClient的WebResourceResponse shouldInterceptRequest (WebView view,
WebResourceRequest request)方法中,该方法用于根据请求去获取响应,如果返回null,那么android会根据请求去获取响应并返回,但是如果你重写了该方法并返回了响应,那么WebView就会使用你的响应数据。其中WebResourceRequet封装了请求,WebResourceResponse封装了响应。

使用静态响应

既然知道了原理,那就试一下,先上代码和效果。

  @Override
  public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

                String response = "<html>\n" +
                        "<title>千度</title>\n" +
                        "<body>\n" +
                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +
                        "</body>\n" +
                        "<html>";

                WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));

                return webResourceResponse;
            }

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                String response = "<html>\n" +
                        "<title>千度</title>\n" +
                        "<body>\n" +
                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +
                        "</body>\n" +
                        "<html>";

                WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));

                return webResourceResponse;
            }

这段代码直接将响应换成了上面的一段html文字。效果如下:
将响应替换成静态内容
代码中重写了两个shouldInterceptRequest方法,其中一个WebResourceResponse shouldInterceptRequest (WebView view, String url)在API 21过时了。

响应使用网络资源

shouldInterceptRequest方法API还有介绍,该方法是在非UI线程中,所以当需要与View系统交互时需要小心。既然是在非UI线程中,那么我们可以放在在其中做网络请求,比如获取www.importnew.com的响应数据,将百度替换为inportnew。

 @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {


                StringBuilder stringBuilder = new StringBuilder();
                BufferedReader bufferedReader = null;
                try {
                    URL url = new URL("http://www.inportnew.com/");
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setConnectTimeout(10 * 1000);
                    httpURLConnection.setReadTimeout(40 * 1000);
                    bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                    String line = "";
                    while ((line = bufferedReader.readLine()) != null)
                        stringBuilder.append(line);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bufferedReader != null)
                        try {
                            bufferedReader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                }


                WebResourceResponse webResourceResponse = null;
                webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(stringBuilder.toString().getBytes()));
                return webResourceResponse;


            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String urlStr) {


                StringBuilder stringBuilder = new StringBuilder();
                BufferedReader bufferedReader = null;
                try {
                    URL url = new URL("http://www.importnew.com/");
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    httpURLConnection.setConnectTimeout(10 * 1000);
                    httpURLConnection.setReadTimeout(40 * 1000);
                    bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                    String line = "";
                    while ((line = bufferedReader.readLine()) != null)
                        stringBuilder.append(line);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bufferedReader != null)
                        try {
                            bufferedReader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                }


                WebResourceResponse webResourceResponse = null;
                webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(stringBuilder.toString().getBytes()));
                return webResourceResponse;

            }

将响应替换成ImportNew的首页响应

注意

WebView中调用的每个请求都会经过那个拦截器,所以如果一个页面中又有超链接,那么依然会经过那个拦截器,所以上面Importnew中有些图片没有加载出来。因为我是以本文形式获取响应的。并且是以utf-8作为编码的,所以有时会出现乱码。

3、应用

之所以会设计到这块,是因为我做一款解析网上文章的app,因为需要对网页内容中删除某些内容以使在手机上显示好看,所以需要拦截请求,将响应中的部分内容删除之后再交由WebView去显示。所以特地研究了WebView拦截请求,不过最好是先判断要加载的URL是否是需要拦截的,如果不是的话,可以依然交给WebView去实现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 网络:使用URLConnection提交请求,获取html代码加载WebView

概述 URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接。 程序可以通过URLConnection实例向该URL发送请求,...
  • u014136472
  • u014136472
  • 2015年08月10日 13:17
  • 1296

Android Webview的postUrl与loadUrl加载页面

项目过程中使用webview的postUrl遇到的坑
  • AXJ1991
  • AXJ1991
  • 2017年11月06日 17:21
  • 444

WebView内使用post加载url并添加header

最近项目内需求,使用WebView加载网页,加载网页的时候需要post参数去让网页生成数据,还要在头部添加一个...
  • lhkzx007
  • lhkzx007
  • 2014年11月26日 23:26
  • 4018

Android WebView中获取网页的title (包括调用goback)

webview 获取 网页的title  WebView mWebView = (WebView) findViewById(R.id.mwebview); mWebView.setWebV...
  • janronehoo
  • janronehoo
  • 2015年07月30日 15:42
  • 24830

Android WebView 获取页面 Title 的正确姿势

现在 Android 开发中用到 WebView 的地方越来越多,开发中经常会遇到 WebView 的坑,这里先转载二篇很好的文章,WebView 开发时如果遇到了问题可以先去这二篇文章里面看看。...
  • zgh0711
  • zgh0711
  • 2017年09月05日 18:51
  • 1102

Android 拦截WebView加载URL,控制其加载CSS、JS资源

绪论最近在项目中有了这样一个需求,我们都知道WebView加载网页可以缓存,但是web端想让客服端根据需求来缓存网页,也就是说web端在设置了http响应头,我根据这个头来拦截WebView加载网页,...
  • lyhhj
  • lyhhj
  • 2015年10月30日 21:47
  • 9220

Android中WebView中拦截所有请求并替换URL

我的博客原文地址: http://hiroz.cn/android-webview-intercept-request/ 需求背景 接到这样一个需求,需要在 WebView 的所有网络请求中...
  • cnzx219
  • cnzx219
  • 2015年06月20日 16:10
  • 10805

Android WebView使用解析一

随着APP中HTML5的占比的增加,WebView这个控件的使用也越来越频发。开发中比较常见的例如新闻详情、课程详情、商品详情、商品展示页等,甚至有些APP中直接把登录注册也直接采用WebView内嵌...
  • ThunderRong
  • ThunderRong
  • 2016年08月18日 08:59
  • 2792

WebView详解

webview是Android展示网页信息的控件,本文就来简要讲解这个控件的用法。关于webview我找到了一些很不错的文章,我就直接贴上连接,自己就不重复造轮子了。本文仅写出我本人目前使用过的东西,...
  • tanranran
  • tanranran
  • 2015年05月12日 19:19
  • 3496

Android拦截html链接事件

文章出处:http://blog.csdn.net/lengguoxing/article/details/42144431在一个大的Android项目中,由于客户端来不及更新和实现,经常会内嵌一些网...
  • zcn596785154
  • zcn596785154
  • 2017年09月30日 11:24
  • 245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android WebView拦截请求详解
举报原因:
原因补充:

(最多只允许输入30个字)