屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面
发如今家里的时候用Android App里的WebView打开站点非常慢,会有十几秒甚至更长时间的卡住。
可是在电脑上打开相同的网页却非常快。
查找这个问题的过程比較曲折,记录下来。
抓取Android网络数据
为了调试这个问题,首先要抓取Android的网络包数据。開始时,是想用Wireshark来抓包的,可是非常麻烦,tcpdump在手机要root权限。
于是转换思路,能不能在Android上设置代理,来抓包?
可是fiddler没有linux版本号,于是转用BurpSuite了。
设置Android代理方法:
在Android网络设置里,长按连接,选择“改动网络”,“显示高级选项”,“代理”,“手动”,然后填上相应的代理的地址。
hosts和路由器配置的坑
抓取到http请求数据,发现訪问非常快,比在手机上快多了。说明并非网络问题。
再细致观察,发现了这个请求:
GET /gngo.js HTTP/1.1
Host: x.adpro.cn
回忆起来,这个是曾经屏蔽电信在网页上插入的流氓广告时配置了hosts:
127.0.0.1 adpro.cn
127.0.0.1 x.adpro.cn
于是在电脑上把这两个hosts凝视掉之后,发现速度变慢了一点,可是不会像手机上那样卡十几秒。
再尝试在电脑上的浏览器打开http://x.adpro.cn/gngo.js,发现打不开。
ping x.adpro.cn
发现返回的结果是127.0.0.1
为什么在hosts文件中把 x.adpro.cn的条目凝视掉了,返回的结果还是127.0.0.1?
折腾了一阵子,尝试各种清除linux dns的方法,发现x.adpro.cn的解析结果还是127.0.0.1。
再次想起,曾经在路由器上配置过防火墙,果然例如以下有配置了对adpro.cn的拦截:
在路由器里把这个规则失效之后,果然ping x.adpro.cn能返回正确的IP了。
原来是路由器把dns相关的请求也拦截了,导致linux取不到新的dns解析结果,一直用的都是旧的结果,所以总是把x.adpro.cn解析为127.0.0.1。
搞清楚缘由之后,又一次在路由器里拦截adpro.cn的数据包,然后又一次载入网页,发现http://x.adpro.cn/gngo.js的请求会在十几秒之后超时:
这就是在手机上为什么打开网页要十几秒的原因了:
路由器把adpro.cn的数据包拦截了,从而socket全然没有数据返回,所以http请求在十几秒后超时,Android WebView才渲染显示出页面。
为什么电脑上非常快?由于配置了127.0.0.1 x.adpro.cn,所以http请求直接返回失败了,不会堵塞住。
很影响体验的运营商广告
在路由器上把拦截去掉,再在手机上訪问,又出现了一个坑爹的事情:
在WebWiew上会显示电信插入的流氓广告,把大部分区域都挡住了。
怎样过滤掉运营商的流氓广告?黑名单还是白名单
假设只是滤掉的话,用户还以后是站点自己弹的广告。那么怎样在App里过滤掉这些流氓广告?
在WebView里过滤某些url:
当url里含有广告地址时,直接返回一个空的回应。
http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest(android.webkit.WebView,
java.lang.String) http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldInterceptRequest(android.webkit.WebView, java.lang.String)
webView.setWebViewClient(new WebViewClient() {
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url.contains("adpro.cn")) {
return new WebResourceResponse(null, null, null);
}
return null;
}
注意的是在api level 11上才干够重载上面的函数。
运营商的广告域名都是相对固定的,能够用黑名单来排除掉。
当然,假设自己的服务都是在自己的域名下的,那么能够考虑採用白名单机制。
白名单机制另一个额外的优点,能够算是一个有一定效果的防止XSS的方法了。
其他的一些东东:
Android上抓包的一些文章:
http://www.trinea.cn/android/android-network-sniffer/ Android利用Fiddler进行网络数据抓包
http://www.freebuf.com/articles/wireless/6517.html 实时抓取移动设备上的通信包(ADVsock2pipe+Wireshark+nc+tcpdump)
屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面的更多相关文章
- JavaScript -- 练习 window 流氓广告
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B
广告域名审核之后跳转技术:点击域名A页面iframe框架下的链接,域名A跳转到域名B注:域名B为afish.cnblogs.com 域名A页面代码:<!DOCTYPE html PUBLIC & ...
- 写个屏蔽百度搜索广告的Chrome插件
工作生活都用百度比较多,毕竟它是目前为止感觉最好的国内PC搜索引擎.我纵使已经差不多炼成了一眼过滤广告的眼力,但始终觉得碍眼,感觉还是写个插件把它屏蔽了吧.这个插件开发的门槛其实非常低,只是一开始做不 ...
- [亲测有效] - Mac下屏蔽优酷广告最简单的方法
这里不和圣母婊争论该不该屏蔽广告,仅给出可行方法. Windows下的Adsafe,万能的去广告神器!可惜Mac下没有这款软件,Adblock之流在国内基本是个玩具,但是我们可以通过修改HOST文件达 ...
- 关于UC、火狐、谷歌浏览器屏蔽布局中广告的解决办法
关于UC浏览器屏蔽了广西人才网的名企.品牌.热点的logo,是因为当成广告过滤掉了,以后div的class和id不能以“ad”开头.这可能只是其中一个规则,adxxxx是可以的,不能是adXxxx, ...
- 屏蔽各类弹窗广告(WPS、智能云输入法)
托盘中的广告“领取双11红包,最高1111元”的罪魁祸首是“智能云输入法” 广告在托盘中闪动: 结束SCSkinInst.exe后,托盘中的广告消失: 智能云输入法的安装路径可参考: C:\Progr ...
- 强大的CSS 属性选择符 配合 stylish 屏蔽新浪微博信息流广告
新建一条微博域名下的规则: @-moz-document domain("weibo.com") { #v6_pl_rightmod_rank,#v6_pl_rightmod_ad ...
- 电信流氓注入JS
(function () { var cs_url = _pushshowjs_.url, cs_delay = window.cs_delay; var cs_styles = window.sty ...
- 屏蔽百度及其广告的部分Host
127.0.0.44 www.baidu.com127.0.0.44 cpro.baidu.com127.0.0.44 hm.baidu.com127.0.0.44 bdimg.share.baidu ...
随机推荐
- python开发与实战content
课时10_字典和集合 课时11 练习:列表运算.doc 课时12_讨论答疑:日志.引用.单例模式等 课时13_函数式编程 课时14 练习:编程实现若干函数.doc 课时15_练习讲解:编写函数 课时1 ...
- [置顶] JSP分页,使用Hibernate+mysql
此代码为博主参考巴巴运动网源码所得,大部分一样,略有修改,在这里分享给大家,也方便自己以后写代码直接copy,看网上很多分页代码JSP里是用JAVA代码,博主原来也是这样,看到源码了解了JSTL,建议 ...
- C语言字符串操作函数
1.函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include < ...
- 4种Delphi IDE的调试时查看内存的方法,太酷了!
1.ctrl+alt+m,可以查看每个函数过程的内存位置 2.Ctrl+Alt+C 查看代码对应的汇编 3.原来用delphi看变量信息一直是简单的用watch看,但是有时候变量值直接用特定类型看总是 ...
- Error:The SDK Build Tools revision (19.0.3) is too low for project ':app'. Minimum required is 19.1.
今天更新了一下AndroidStudio, 结果编译程序时报错, 错误如下: Error:The SDK Build Tools revision (19.0.3) is too low for pr ...
- SpringMVC批量上传
@RequestMapping(value = "/upload") public String handleFormUpload(MultipartHttpServletRequ ...
- RobotFrameWork(十一)AutoItLibrary测试库在win7(64bit)下安装及简单使用
最近安装AutoItLibrary,发现在win7 x64下无法安装成功,后来经过定位,发现是3rdPartyTools\AutoIt目录下面AutoItX3.dll的问题.因为AutoItX3.dl ...
- 修改Hosts文件
Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制. Hosts文件的存储位置在不同的操作系统中并不相同,甚至不 ...
- 注解框架---AndroidAnnotations
AndroidAnnotations是一个开源框架,旨在加快Android开发的效率.通过使用它开放出来的注解api,你差点儿可以使用在不论什么地方, 大大的降低了无关痛痒的代码量,让开发人员可以抽身 ...
- swt,jface,rcp
//swt-jface-rcp,基本结构:display类,shell类,组件:widget窗口控件,control控件,composites面板,button,label,text文本框,list列 ...