公司采用了H5和Android混合开发,以原生代码为壳,H5代码编写逻辑的方式做产品。笔者之前写过一篇文章简单聊到了这种方式,有兴趣的朋友可以了解一下,顺便点个赞。Android原生与H5通信
而在这种方式的使用过程中笔者碰到了一个问题,偶然性的会出现广告,各种各样的广告。并且不是必然触发。
通过查询各种资料(其实就是百度)。发现问题应该只会出现在以下三种情况内:
- DNS被劫持
- 第三方包带广告
- Http被劫持
什么是DNS被劫持:
DNS是在作为域名www.baidu.com和IP地址(192.168.1.1)相互映射的一个分布式数据库,就是我们的浏览器,会将域名拿到DNS去解析出ip地址来访问,DNS劫持是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。
通俗讲,DNS帮我们指向了另一个地址,或者让我无法访问。
什么是HTTP劫持:
HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。
通俗讲,你要去别人家的首页,他会给你别人家的首页,但却在别人家首页某个部位加个小广告,还可以控制关掉。。 让人无奈。现在很多免费WIFI植入广告的手段,为了博取更多点击量。
问题排查:
由于笔者在很多地方的wifi甚至4G网都出现了广告,所以可以直接排除DNS被劫持的问题。而广告页只会在H5的页面出现,所以基本可以排除第三方包带广告的问题,所以问题基本可以确定是Http被劫持了。
网上几乎所有文章的解决方案都是使用Https替换Http。笔者感觉此方法可行,简单讲Https就是Http的安全版。不过由于公司原因,暂时没有Https通道,所以短时间没法替换。
通过查看Android原生WebView的拦截日志,发现了广告页面的地址是会被拦截到的,而我们自己的H5页面放在自己的服务器上,IP和端口号是固定的当前使用服务器的ip和端口,广告页的ip和端口肯定和我们是不一致的,从这里入手。笔者拦截了url,将广告url拦截并且不允许它继续执行打开,至此,从用户的角度算是完全解决了广告的问题。
拦截代码:
webView.setWebViewClient(new WebViewClient() {
// Load opened URL in the application instead of standard browser
// application
public boolean shouldOverrideUrlLoading(WebView view, String url) {
showLogInfo("拦截到的url----"+url);
String advertising="http://"+sharedPreferencesUtil.getData(Constant.IP, RequestConfig.IP)
+":"+sharedPreferencesUtil.getData(Constant.PORT,RequestConfig.IPPORT);
if (url.contains(pre)) {
Map<String, String> map = getParamsMap(url, pre);
String code = map.get("code");
String data = map.get("data");
parseCode(code, data);
return true;
}else if(!url.contains(advertising)){
showLogError("拦截到植入广告,广告的url——"+url);
return true;
} else{
return false;
}
}
});