Javascript限制网页只能在微信内置浏览器中访问


Posted in Javascript onNovember 09, 2014

那么问题就来了,这个网页首先涉及到了移动web前端开发,我优先选择了用HTML5+bootstrap组合来实现页面的美观效果,前端其他的任务交给javascript解决(这里我是完全使用原生javascript代码,没有用到任何的框架,因为考虑到手机加载网页的速度本来就慢,而且框架中很多用不到的功能也会随网页一起加载,耗费用户流量)。

一切功能都就绪以后,客户试用也觉得很满意,之后我就把代码提交到了正式的服务器上。不过,对方又突然提到了一点:你做的页面确实挺漂亮的,兼容性也不错,但是这个页面用电脑上的浏览器也是可以访问的,那么其他人就可以很随便地查看页面的源代码,进而copy整个页面,能不能有什么方法防止这一点?那么问题就又来了,我是第一次做微信二次开发,还没遇到过这样的需求,怎么搞定呢?

一时间想不出来,后来我就把这个问题先放了放,去做后台的一些业务。在做后台的一个数据采集功能时,PHP代码当中用到了$_SERVER['HTTP_USER_AGENT']这个参数,我突然想到浏览器访问网页时都会发送一个UserAgent给服务器,它里面包含了一些浏览器及用户操作系统的基本信息,既然微信有内置浏览器,那么用微信浏览网页时这个UserAgent里面会不会带上和微信相关的独有的标识呢(毕竟腾讯这么大个公司,而微信又是他们的核心产品之一)?干脆用代码打印一下它的UserAgent来一探究竟,javascript代码如下:

<script type="text/javascript">

    alert(navigator.userAgent);

</script>

在我的手机上得到了如图所示的结果:

Javascript限制网页只能在微信内置浏览器中访问

这一下果然还真的看到了不一样的地方,相信聪明的朋友也已经发现了,没错,就是这个东西:MicroMessenger/6.0.0.50_r844973.501,斜杠后面的这一串就是我当前使用的微信的版本号,前面则应该是微信的一个独有标识了。其实我一开始看成了MicroMessage,想着中文翻译过来是“微消息”的意思,但仔细一看发现不是的,后面查了词典才知道Messenger这个词有“报信者,送信者”的意思,也就不觉得奇怪了。这个标识应该来说是其他浏览器不会有的,那么解决方案就来了,请看代码:

<script type="text/javascript">

    // 对浏览器的UserAgent进行正则匹配,不含有微信独有标识的则为其他浏览器

    var useragent = navigator.userAgent;

    if (useragent.match(/MicroMessenger/i) != 'MicroMessenger') {

        // 这里警告框会阻塞当前页面继续加载

        alert('已禁止本次访问:您必须使用微信内置浏览器访问本页面!');

        // 以下代码是用javascript强行关闭当前页面

        var opened = window.open('about:blank', '_self');

        opened.opener = null;

        opened.close();

    }

</script>

这段代码在Android、iPhone、iPad、PC上都进行了测试,只要不是在微信内部打开网页的,首先就会弹出上面那个警告框,此时后面的页面是空白的,什么都还没加载,当点击警告框的确定按钮之后,最后三行代码将强行关闭当前页面。OK,到这里算是实现了用户原本的意思了,可以简单收工了。

等等,真的可以这样收工了么?你确定不会有其他问题?当然不是,其实这个方法并不会让你高枕无忧,因为对于伪造的UserAgent,还是可以绕过这条限制的,总的来说就是防君子不防小人了,大家懂得。当然,如果哪位朋友有解决这个问题的更好方法,还麻烦在下面评论告知,技术在于相互的分享和交流嘛,呵呵。

Javascript 相关文章推荐
node.js中的fs.unlinkSync方法使用说明
Dec 15 Javascript
jQuery三级下拉列表导航菜单代码分享
Apr 15 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
smartupload实现文件上传时获取表单数据(推荐)
Dec 12 Javascript
js实现文本上下来回滚动
Feb 03 Javascript
ionic2打包android时gradle无法下载的解决方法
Apr 05 Javascript
详解Node.js串行化流程控制
May 04 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
Vue项目打包部署到apache服务器的方法步骤
Feb 01 Vue.js
js闭包的用途详解
Nov 09 #Javascript
js闭包实例汇总
Nov 09 #Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 #Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 #Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 #Javascript
js 操作符汇总
Nov 08 #Javascript
jquery的总体架构分析及实现示例详解
Nov 08 #Javascript
You might like
缓存技术详谈―php
2006/12/14 PHP
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
python获取各操作系统硬件信息的方法
2015/06/03 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
深入学习Python中的装饰器使用
2016/06/20 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python如何生成各种随机分布图
2018/08/27 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
电大学习个人自我评价范文
2013/10/04 职场文书
毕业生求职简历的自我评价
2013/10/07 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
新法人代表任命书
2014/06/06 职场文书
个人总结格式范文
2015/03/09 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers