电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解

瀏覽:55日期:2022-09-23 11:14:03

需求背景

接到這樣一個(gè)需求,需要在 WebView 的所有網(wǎng)絡(luò)請(qǐng)求中,在請(qǐng)求的url中,加上一個(gè)xxx=1的標(biāo)志位。

例如 http://www.baidu.com 加上標(biāo)志位就變成了 http://www.baidu.com?xxx=1

尋找解決方案

從 Android API 11 (3.0) 開始,WebView 開始在 WebViewClient 內(nèi)提供了這樣一條 API ,如下:

public WebResourceResponse shouldInterceptRequest(WebView view, String url)

就是說只要實(shí)現(xiàn) WebViewClient 的 shouldInterceptRequest 方法,然后調(diào)用 WebView 的setWebViewClient 就可以了。

但是,在 API21 以上又棄用了上述 API,使用了一條新的 API,如下:

public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request)

好吧,為了支持盡量多的版本,看來兩個(gè)都需要實(shí)現(xiàn)了,發(fā)現(xiàn)一看就非常好用的 String url 變成了一個(gè)WebResourceRequest request。WebResourceRequest 這個(gè)東西是一個(gè)接口,并且是這樣定義的:

public interface WebResourceRequest { Uri getUrl(); boolean isForMainFrame(); boolean hasGesture(); String getMethod(); Map<String, String> getRequestHeaders();}

在其中沒有發(fā)現(xiàn)任何可以直接替換請(qǐng)求的方法。

然后搜索了一下 Android 代碼中對(duì)他的引用,點(diǎn)我搜索。然后發(fā)現(xiàn) private static class WebResourceRequestImpl implements WebResourceRequest 它的內(nèi)部實(shí)現(xiàn)僅僅是一個(gè)單純的實(shí)體。那這個(gè)東西要替換就非常好辦了,三個(gè)方法都可以做:

動(dòng)態(tài)代理 反射 重新實(shí)現(xiàn)

實(shí)現(xiàn)

方案確定了,剩下的就簡(jiǎn)單了。直接上代碼。

首先是往URL字符串加那個(gè)標(biāo)志位的方法

public static String injectIsParams(String url) { if (url != null && !url.contains('xxx=') { if (url.contains('?')) { return url + '&xxx=1'; } else { return url + '?xxx=1'; } } else { return url; }}

然后要攔截所有請(qǐng)求了

webView.setWebViewClient(new WebViewClient() { @SuppressLint('NewApi') @Override public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request) { if (request != null && request.getUrl() != null) { String scheme = request.getUrl().getScheme().trim(); if (scheme.equalsIgnoreCase('http') || scheme.equalsIgnoreCase('https')) { return super.shouldInterceptRequest(view, new WebResourceRequest() { @Override public Uri getUrl() { return Uri.parse(injectIsParams(request.getUrl().toString())); } @SuppressLint('NewApi') @Override public boolean isForMainFrame() { return request.isForMainFrame(); } @SuppressLint('NewApi') @Override public boolean hasGesture() { return request.hasGesture(); } @SuppressLint('NewApi') @Override public String getMethod() { return request.getMethod(); } @SuppressLint('NewApi') @Override public Map<String, String> getRequestHeaders() { return request.getRequestHeaders(); } }); } } return super.shouldInterceptRequest(view, request); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (!TextUtils.isEmpty(url) && Uri.parse(url).getScheme() != null) { String scheme = Uri.parse(url).getScheme().trim(); if (scheme.equalsIgnoreCase('http') || scheme.equalsIgnoreCase('https')) { return super.shouldInterceptRequest(view, injectIsParams(url)); } } return super.shouldInterceptRequest(view, url); } });

大功告成。

歡迎指出代碼中的問題~~一起學(xué)習(xí)進(jìn)步

注意: 注意保護(hù) URL 的 Scheme,在代碼中特地過濾了 http 和 https。

引申

上邊的 API 中發(fā)現(xiàn)還能有更多的玩法,比如:

替換 WebResourceResponse,構(gòu)造一個(gè)自己的 WebResourceResponse。比如下列代碼,用一個(gè)包里的本地文件替換掉要請(qǐng)求的網(wǎng)絡(luò)圖片。

WebResourceResponse response = null; if (url.contains('logo')) { try { InputStream is = getAssets().open('test.png'); response = new WebResourceResponse('image/png', 'UTF-8', is); } catch (IOException e) { e.printStackTrace(); } }return response;

在 API 21 (5.0) 以上的版本使用了 WebResourceRequest 接口,這個(gè)接口能修改發(fā)出請(qǐng)求的 Header

@Overridepublic Map<String, String> getRequestHeaders() { return request.getRequestHeaders();}

在 API 21 (5.0) 以上的版本中可以區(qū)分 GET 請(qǐng)求和 POST 請(qǐng)求,在某些情況下,需要區(qū)分 AJAX 的不同種類請(qǐng)求的時(shí)候可以用到。

到此這篇關(guān)于在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解的文章就介紹到這了,更多相關(guān)Android WebView攔截所有請(qǐng)求并替換URL內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 济南铝方通-济南铝方通价格-济南方通厂家-山东鲁方通建材有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 好笔杆子网 - 公文写作学习交流分享平台 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 江苏皓越真空设备有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 最新电影-好看的电视剧大全-朝夕电影网 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 上海办公室装修_上海店铺装修公司_厂房装潢设计_办公室装修 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 缝纫客 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 长城人品牌官网| IPO咨询公司-IPO上市服务-细分市场研究-龙马咨询 | 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 电动葫芦|环链电动葫芦-北京凌鹰名优起重葫芦 |