浏览器默认都是拒绝ajax跨域名请求数据
但可以通过php设置header信息来允许请求
header("Access-Control-Allow-Origin:*"); 或 header("Access-Control-Allow-Origin: *.mi.com");
但此中方式只适合firefox,google浏览器,微软的IE7,8,9浏览器都是不支持跨域请求,没有解决方法
IE浏览器唯一解决方式只能是jsonp的方式输出<script>标签的形式来解决跨域请求!
好消息是手机端浏览器都是采用webkit内核都是只需要设置下header就直接支持跨域请求,不需要再做兼容了!
关于解决跨域需要设置cookie的问题
IE浏览器通过jsonp访问形式解决跨域时必须在php中设置隐私策略,才能种植cookie
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
而firefox,google浏览器则不需要设置都可以直接种植cookie!
https网站ajax请求http网站或加载http静态资源时(css,js,image)时在有些浏览器中可能会禁止访问,所以最好升级成https
json和jsonp的区别
json是请求数据的一种方式,当不涉及cookie传送时建议用这种方式,取回来的数据是json格式
jsonp是为子解决IE不能跨域以及需要种植cookie和发送cookie时的一种解决方案,比如要验证登录才能取数据等等,缺陷是只能get方式,如图片数据无法post提交
如使用jquery扩展库,
ajax请求时不使用jsonp方式时可以设置xhrfields 参数实现传递cookie过去
<script>
$(function(){
$.ajax({
type: "post",
url: '//m.test.shengmiguo.com/business_app.php?app=business_member&do=login',
data: {
username:'1325028',
password:'123456'
},
dataType: "jsonp", //或json数据格式
success: function(data){
alert(data.msg);
}
});
});
</script>
则非常方便解决跨域来请求数据的难题
注:若浏览器开启了禁止或阻止第三方 Cookie 和网站数据,则jsonp也无法写入cookie
另外一个完全解决方法是使用空iframe,设置长宽为0,使用form表单target属性提交,这样可以做到任意post大数据提交,然后js设置document.domain=*.test.com
如:
<script>
document.domain=*.test.com;
parent.login(user,password);
</script>