Ajax 浏览器跨域访问控制
2019独角兽企业重金招聘Python工程师标准>>>
jsonp+ajax实现浏览器跨域通信的原理解析
php+ajax+P3P实现多域名跨域登录
一.关于跨域需要设置的响应头消息
Access-Control-Allow-Origin:* #允许所有主机
Access-Control-Allow-Origin:http://hello-world.example #允许特定主机Access-Control-Allow-Methods: POST, GET, OPTIONS #允许跨域执行的方法Access-Control-Allow-Headers: X-PINGOTHER,Content-Type,MyHeader #允许跨域设置的头信息(如果不设置,那么无法获取该值,甚至数据无法获取)Access-Control-Max-Age: 1728000
二.关于IE8和IE9浏览器差异性说明
IE8和IE9使用新的API XDomainRequest(IE又淘气了一次,但还好IE7上可以通过ajax跨域)
var xdr = new XDomainRequest();xdr.onload = function (e) { //当收到服务器响应的回调函数var data = $.parseJSON(xdr.responseText);if (data == null || typeof (data) == 'undefined') {data = $.parseJSON(data.firstChild.textContent);}//success};xdr.onerror = function (e) {//error}xdr.open("GET", url); //目前只支持IE8和IE9
xdr.send();
对于webkit阵营的浏览器而言,需要使用ajax,这里我们不在多演示,我们将在下面做一个兼容性的例子。
三.为了达到兼容性的指标,我们进行如下改造
设立一站点 www.a.com,作为请求的client
<!doctype html>
<html><head><meta charset="utf-8" /><title>Cross-Domain</title><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /></head><body><script type="text/javascript" charset="utf-8">var xdr = null;if(!!window.XMLHttpRequest){xdr = new XMLHttpRequest();}else if( window.ActiveXObject){try{ //IE7+xdr = new ActiveXObject("Msxml2.XMLHTTP");}catch (e) {//IE6-try { xdr = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { } }}if(xdr){ if(!("withCredentials" in xdr) && window.XDomainRequest) {xdr = new XDomainRequest();}else{xdr['withCredentials'] = true;}if(window.XMLHttpRequest && (xdr instanceof XMLHttpRequest))//如果是IE6,IE7,chrome,firefox,IE10,IE11{xdr.open('OPTIONS', 'http://www.b.com/html5/crossdomain-server.php', true);}else if(window.ActiveXObject&&(xdr instanceof XDomainRequest))//如果是IE8,IE9{xdr.open("POST", "http://www.b.com/html5/crossdomain-server.php");}xdr.onload = function(e) {xdr.onReadyStateChange(arguments); };xdr.onReadyStateChange = function(e){if(window.console){console.dir(xdr.responseText);}else{alert(xdr.responseText);}}xdr.send(null);}else{alert('Not Supported !');} </script></body>
</html>
设立服务器站点 www.b.com/html5/crossdomain-server.php
<?php
header('Content-Type:application/json;charset=utf-8');
header('Pragma:no-cache,no-store');
header('Cache-Control:no-cache,private');
header('Date:'+date('r'));
header('Connection:Keep-Alive');header('Access-Control-Allow-Origin: http://www.a.com');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS,PUT,DELETE,HEAD');
header('Access-Control-Allow-Headers: X-PINGOTHER,Content-Type,Accept,Range');
header('Access-Control-Max-Age: 1728000');
header('Access-Control-Allow-Credentials: true');date_default_timezone_set('Asia/Chongqing');$data = array('id' => 'ZF1024','name'=>'zhangsan','token'=>uniqid()
);echo json_encode($data);?>
请求结果
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
三.html5 postMessage 进行跨域
a.com/index.html中的代码:<iframe id="ifr" src="b.com/index.html"></iframe>
<script type="text/javascript">
window.onload = function() {var ifr = document.getElementById('ifr');var targetOrigin = 'http://b.com'; // 若写成'http://b.com/c/proxy.html'效果一样// 若写成'http://c.com'就不会执行postMessage了ifr.contentWindow.postMessage('I was there!', targetOrigin); //通过这句穿透域名限制
};
</script>
b.com/index.html中的代码:<script type="text/javascript">window.addEventListener('message', function(event){// 通过origin属性判断消息来源地址if (event.origin == 'http://a.com') {alert(event.data); // 弹出"I was there!"alert(event.source); // 对a.com、index.html中window对象的引用// 但由于同源策略,这里event.source不可以访问window对象}}, false);
最后,你还可以通过apache服务器设置跨域
<IfModule mod_setenvif.c><IfModule mod_headers.c><FilesMatch "\.(cur|gif|ico|jpe?g|png|svgz?|webp)$">SetEnvIf Origin ":" IS_CORSHeader set Access-Control-Allow-Origin "*" env=IS_CORS</FilesMatch></IfModule>
</IfModule>
参考:http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html#m2
http://msdn.microsoft.com/zh-cn/library/gg589525(v=vs.85).aspx
转载于:https://my.oschina.net/ososchina/blog/346964
Ajax 浏览器跨域访问控制相关推荐
- 浏览器跨域访问控制(CORS)
一. 什么是跨域? 出于安全考虑,浏览器限制页面脚木发起跨域请求,所以XMLHttpRequest和fetch API是遵循同源策略的. 例如,在http://domain-a.com 页面用XMLH ...
- jsonp+ajax实现浏览器跨域通信
2019独角兽企业重金招聘Python工程师标准>>> Ajax/XDomainRequest 网络跨域访问控制 jsonp是一种技术手段而不是一种协议,也不是json数据. < ...
- ajax跨域访问控制
ajax跨域访问控制 转载于:https://www.cnblogs.com/macT/p/10214014.html
- jfinal里使用ajax,Jfinal解决AJAX的跨域请求
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful. 一开始使用AJAX来传输json数据时, ...
- 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
- VUE -- Mac上解决Chrome浏览器跨域问题
最近做前端开发总是遇到一个很奇怪的现象,同一个AJAX请求,在Chrome里调试的时候就会提示跨域,但是在手机模拟器或者真机上调试的时候就不会,于是百度了一下,发现是Chrome的安全策略导致的,需要 ...
- 记录 关于浏览器跨域和设置默认浏览器的问题
@Author:Runsen 当你使用ajax访问本地的json文件的时候,就会报from origin 'null' has been blocked by CORS policy: Cross o ...
- nginx配置ajax请求跨域
首先通过mozilla文档了解跨域原理: web跨域的方式有几种,常见的方案有web服务后端代码层级解决与nginx配置层面解决,这里我以nginx配置层面为例. 一般浏览器跨域请求的时候会先发起op ...
- ajax+php跨域请求数据库,基于jQuery的ajax跨域请求,PHP作为服务器端代码
ajax实现跨域请求有两种方式: 方法一:jsonp的方式 jsonp方式的关键点在客户请求以jsonp作为数据类型,服务器端接收jsonp的回调函数,并通过回调函数进行数据的传输.具体代码如下: 客 ...
最新文章
- MATLAB 结构型变量
- 加密生成指定长度_那些奇奇怪怪的需求(一):PinyinHelper的使用、生成指定长度的随机码...
- SharePoint 2010 各个常用级别对象的获取
- android ProgressBar 使用方法
- C++ std::condition_variable wait() wait_for() 区别
- leetcode669. 修剪二叉搜索树
- 论文浅尝 | 利用类比推理优化知识图谱向量表示
- Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关
- 如何查看selenium的版本号
- 汇编语言学习--转移指令的原理
- Ⅴ0还有别的方法设置图案吗_水冷空调扇如何使用 水冷空调扇使用方法介绍【图文】...
- EasyUI的combobox
- Excel图表快捷操作小技巧
- 自动化测试框架cucumber_10分钟学会 Cucumber+Watir 自动化测试框架
- python win32com 批量加密excel 新增sheet 调整sheet顺序
- Tmux Cheat Sheet
- 面试技巧: 轻松过关10种方法
- Altium Designer初学教程(一)
- python实例方法不可以用类调用_python中可以直接用类调用方法吗
- 基于springboot实现大学生租房系统演示【附项目源码】
热门文章
- ScrollView详解
- 中国人工智能学会通讯——基于视频的行为识别技术 1.5 基于深度学习的视频识别方法...
- AngularJS学习笔记(1) - AngularJS入门
- Java中break、continue及标签等跳转语句的使用[下]
- CCRD_TOC_2008年第1期
- TurboMail邮件系统为防垃圾邮件盗号提供专业方案
- Linux 命令(61)—— ldd 命令
- 为什么把持久化放到Domain Object是不OO的.
- [题解](树形dp/换根)小x游世界树
- ubuntu16.04 内核源码编译