android 拦截webview资源请求,android那些事--WebView拦截使用

本文介绍了如何在Android中使用WebView并拦截其资源请求。通过重写`shouldOverrideUrlLoading`和`shouldInterceptRequest`方法,可以自定义响应内容,例如返回静态HTML或从网络获取数据。在`shouldInterceptRequest`中进行网络请求以获取importnew.com的内容,并展示在WebView中,但需要注意处理图片和其他资源的加载,避免乱码和不完整显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WebView最简单的用法就是loadUrl方法.

常用代码如下.

demoWv = ((WebView) findViewById(R.id.demoWv));

WebSettings settings = demoWv.getSettings();

// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true

settings.setJavaScriptEnabled(true);

demoWv.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

// 是否使用第三方浏览器 返回true不调用 返回false调用

return true;

}

});

demoWv.loadUrl("https://www.baidu.com");

08920c2bb128

这里写图片描述

WebView拦截请求

WebView调用loadUrl后,会首先根据传入URL获取响应,然后再将响应显示到页面上,这就是WebView的原理.根据这个原理,那么我们可以在获取响应过程中重新改变请求URL或者直接将响应替换.

而具体的替换在WebViewClient的:

WebResourceResponse shouldInterceptRequest(

WebView view,WebResourceRequest request

)

这个方法中,该方法用于根据请求去获取响应,如果返回null,那么android会根据请求去获取响应并返回,但是如果你重写了该方法并返回了响应,那么WebView就会使用你的响应数据.其中WebResourceRequest封装了请求,WebResourceResponse封装了响应.

使用静态响应

既然知道了原理,就可以写个demo测试一下

demoWv = ((WebView) findViewById(R.id.demoWv));

WebSettings settings = demoWv.getSettings();

// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true

settings.setJavaScriptEnabled(true);

demoWv.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

// 是否使用第三方浏览器 返回true不调用 返回false调用

return true;

}

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

String result = "\n" +

"

千度\n" +

"

\n" +

"千度,比百度知道的多10倍\n" +

"\n" +

"";

WebResourceResponse response = new WebResourceResponse("text/html",

"utf-8",

new ByteArrayInputStream(result.getBytes()));

return response;

}

});

demoWv.loadUrl("https://www.baidu.com");

08920c2bb128

这里写图片描述

使用网络资源响应

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

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

demoWv = ((WebView) findViewById(R.id.demoWv));

WebSettings settings = demoWv.getSettings();

// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true

settings.setJavaScriptEnabled(true);

demoWv.setWebViewClient(new WebViewClient() {

@Override

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

// 是否使用第三方浏览器 返回true不调用 返回false调用

return true;

}

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

return getWebRes();

}

});

demoWv.loadUrl("https://www.baidu.com");

}

private WebResourceResponse getWebRes() {

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;

}

08920c2bb128

这里写图片描述

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

应用

在实际应用中,最好时先判断要加载的URL是否需要拦截,如果不是的话,可以以然交给WebView去实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值