场景:
图文统计:要统计一篇图文推送到手机端的阅读量,我是在这个页面加上了一个Ajax请求,当页面加载的时候发送请求到后端,来统计阅读量,返回数量。
页面链接是经过Apach映射的。
在生产环境一直统计不到,Ajax请求没有发出来,后来发现是由于该页面是Https的,而其中发送的Ajax请求servlet的url是http的。
在火狐调试报错:"已阻止载入混合活动内容"
原理:
当一个HTTPS页面中包含HTTP内容时,即使主页面是经过SSL加密受HTTPS协议保护,但其中的HTTP内容可以被攻击者阅读或更改;这种HTTPS页面包含HTTP内容的情况,就被称为“混合内容”。
这种内容是不安全的,如果主页面是HTTPS,但iframe src引用HTTP内容,Firefox23默认会阻止这种内容的显式!
ps:但是安卓机有一台华为却能统计到的,其他安卓机统计不到,后来百度发现这台安卓机是Android4.4.4,而从Android5.0开始,WebView默认不支持同时加载Https和Http混合模式。所以这台安卓机可以统计到图文阅读量。
解决方式:
我把Ajax要请求servlet的url也改成了https的,就可以在手机端打开后成功发送ajax了,并能获取到返回的数据。
由于我的事一个简单页面,所以没用jquery,而是用的简单的原生ajax请求,轻量。
<script> window.onload = function(){ var messageIdElement = document.getElementById('file_messageId'); var messageId = messageIdElement.value; var user_agent = navigator.userAgent; var i = user_agent.indexOf('YSTUSERCODE'); var userCode = ''; if(i != -1){ userCode = user_agent.substring(i,user_agent.length); } var xmlHttp; if(window.ActiveXObject){ xmlHttp = new ActiveXObject('Microsoft.XMLHTTP'); }else if(window.XMLHttpRequest){ xmlHttp=new XMLHttpRequest(); } var url = 'msgTwTJurl?id='messageId'&userCode='userCode ; alert('url='url); xmlHttp.open('get',url,true); xmlHttp.send(); xmlHttp.onreadystatechange=function(){ if(this.readyState == 4){ if(this.status >=200 && this.status <400){ var readCount= this.responseText; var span = document.getElementById('readCount'); span.innerHTML=readCount; } } } }; </script>