需求背景是有些H5上的请求需要拦截掉,直接返回失败/空。

这里留个笔记。

// mWebview.setWebChromeClient(new NChromeClient());private final class NWebViewClient extends WebViewClient {...@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && request != null && request.getUrl() != null) {WebResourceResponse response = check(request.getUrl().toString());if (response != null) return response;}return super.shouldInterceptRequest(view, request);}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {WebResourceResponse response = check(url);return response != null ? response : super.shouldInterceptRequest(view, url);}private WebResourceResponse check(String url) {if (url.length() <= 8) return null;int indexHost = url.indexOf("/", 8);int indexPort = url.indexOf(":", 8);int indexUrl = url.indexOf("?", 8);if (indexHost < 0) return null;if (indexPort > 0) indexHost = Math.min(indexHost, indexPort);if (indexUrl > 0) indexHost = Math.min(indexHost, indexUrl);String host = url.substring(0, indexHost);if (!host.endsWith("yeshen.org")) {return new WebResourceResponse("text/html", "utf-8",new ByteArrayInputStream("".getBytes()));}return null;}
}

拦截替换URL地址,比如将 test.yeshen.org 替换成 yeshen.org

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && request != null&& request.getUrl() != null && request.getUrl().getHost() != null) {String host = request.getUrl().getHost();String url = request.getUrl().toString();if (host.equals("yeshen.org")) {return super.shouldInterceptRequest(view, request);} else if (host.equals("test.yeshen.org")) {Uri uri = Uri.parse(url.replace("test.yeshen.org", "yeshen.org"));return super.shouldInterceptRequest(view, new YeshenWebResourceRequest(uri, request));}}return super.shouldInterceptRequest(view, request);
}@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {String host = getHost(url);if (host.equals("yeshen.org")) {return super.shouldInterceptRequest(view, url);} else if (host.equals("test.yeshen.org")) {return super.shouldInterceptRequest(view,url.replace("test.yeshen.org", "yeshen.org"));}return super.shouldInterceptRequest(view, url);
}@NonNull
private String getHost(String url) {if (TextUtils.isEmpty(url)) return "";int hostStart = url.indexOf("://") + 3;if (hostStart < 0) return "";int indexHost = url.indexOf("/", hostStart);int indexPort = url.indexOf(":", hostStart);int indexUrl = url.indexOf("?", hostStart);if (indexHost < 0) return "";if (indexPort > 0) indexHost = Math.min(indexHost, indexPort);if (indexUrl > 0) indexHost = Math.min(indexHost, indexUrl);return url.substring(hostStart, indexHost);
}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static final class YeshenWebResourceRequest implements WebResourceRequest {private final Uri mUri;private final WebResourceRequest mOld;private YeshenWebResourceRequest(@NonNull Uri uri, @NonNull WebResourceRequest old) {mUri = uri;mOld = old;}@Overridepublic Uri getUrl() {return mUri;}@Overridepublic boolean isForMainFrame() {return mOld.isForMainFrame();}@TargetApi(Build.VERSION_CODES.N)@Overridepublic boolean isRedirect() {return mOld.isRedirect();}@Overridepublic boolean hasGesture() {return mOld.hasGesture();}@Overridepublic String getMethod() {return mOld.getMethod();}@Overridepublic Map<String, String> getRequestHeaders() {return mOld.getRequestHeaders();}
}

webview拦截请求相关推荐

  1. android webview 拦截响应,android WebView拦截请求详解

    1.WebView基本用法 WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限.我也简单了写了一个加载百度的 ...

  2. android资源加载失败,解决Android WebView拦截url,视频播放加载失败的问题

    解决Android WebView拦截url,视频播放加载失败的问题 发布时间:2020-10-08 05:19:44 来源:脚本之家 阅读:86 作者:灵均子孟 需求:Android调用webVie ...

  3. ajax被token拦截,vue中封装ajax请求,并且拦截请求在请求头中添加token

    /** * 封装请求方法 * @param {Object} url 接口请求地址 * @param {Object} data 接口请求参数(无需请求方式参数,则此项可以为空,否则必须传) * @p ...

  4. 拦截请求并记录相应信息-springboot

    拦截请求并记录相应信息-springboot 方式: 1.FIlter过滤器 2.interceptor拦截器 3.Aspect切片 一.Filter过滤器形式 只能处理request中的数据  不能 ...

  5. node 拦截器拦截请求下载电子书以及等待前端渲染操作、浏览器操作

    1.因为下载资源是通过点击事件来ajax请求的,无法在页面看到a标签链接2.通过拦截器来拦截3.等待前端渲染完成后(类挂载后)获取数据await page.waitForSelector('选择器') ...

  6. fiddler拦截请求、篡改响应内容、模拟弱网

    用途:用于一些安全性方面的校验,例如修改密码中间有一个步骤需要校验手机验证码,如果拦截接口返回的数据将失败修改为成功,在发送给浏览器,就能绕过验证码直接输入新密码 1.拦截请求 在浏览器发起请求直接在 ...

  7. 从0到1实现一个Android路由(6)——拦截请求再跳转

    从0到1实现一个Android路由系列文章 从0到1实现一个Android路由(1)--初探路由 从0到1实现一个Android路由(2)--URL解析器 从0到1实现一个Android路由(3)-- ...

  8. android html拦截广告,Android WebView拦截iframe标签内部跳转教程

    最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理. 比如,下面是一段html代码,嵌套这iframe标签, ...

  9. android webview拦截加载离线文件

    概述 客户端经常会通过使用webview来用H5实现一些ios与android双端都有的功能,最常见的比如一些活动页面,内部广告页面等. 这些页面大概会有以下几个特点: 要求webview快一些,白屏 ...

最新文章

  1. linux wireshark使用教程,技术|Ubuntu 上 Wireshark 的安装与使用
  2. Java数据类型简单认识
  3. html css 极简模板,极简主义作品展示HTML模板
  4. 【MM模块】Procurement for Stock Material 库存型物料采购相关
  5. Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00
  6. [C++] Nested Radical Constant
  7. python之路 mysql 博客园_Python之路(二十七):Mysql(下)
  8. 音视频编解码的一些源代码
  9. 越来越受欢迎的Vue想学么,90后小姐姐今儿来教你
  10. 指令由电子计算机,电子计算机主要是以
  11. 使用@onetomany取不到值_SpringCloud微服务架构篇2:微服务基础—SpringBoot使用
  12. 大型企业通用ERP进销存源码 ASP.Net开发系统源码
  13. 安卓psp模拟器联机教程_psp模拟器联机平台下载
  14. ps考证是人改分的还是电脑
  15. 野火STM32F429学习笔记
  16. python表示倍数的英语句型_5种倍数表达法句型
  17. ADSAD合辑(一)
  18. 影响百度SEM竞价账户推广效果的8大因素
  19. linux中ftp服务器的搭建和配置
  20. android电视 浏览器 全屏,小屏幕大世界 傲游云浏览器Android全屏模式

热门文章

  1. 软路由折腾记(一)openwrt
  2. 牛客网50道选择题(1)
  3. 在vue中获取input上传图片的宽和高
  4. 蜗牛爬树c语言程序函数,弹涂鱼上树吃蜗牛?鄂教版小学二年级课文遭吐槽
  5. 找不到 Web 地址对应的网页:_Web服务器的配置与管理
  6. 输入10个数求其中的最大值。
  7. 在买了38台件米家智能家居后,告诉你米家什么不值得买
  8. 2019.9.19年华为杯数模
  9. 【深度学习】万字解读首篇「人脸复原」综述!南大、中山、澳国立、帝国理工等联合发布...
  10. Polkadot 波卡交易所对接资料收集以及测试/公链部署参考