2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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);?>

请求结果

181027_5WEB_2256215.png

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

三.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 浏览器跨域访问控制相关推荐

  1. 浏览器跨域访问控制(CORS)

    一. 什么是跨域? 出于安全考虑,浏览器限制页面脚木发起跨域请求,所以XMLHttpRequest和fetch API是遵循同源策略的. 例如,在http://domain-a.com 页面用XMLH ...

  2. jsonp+ajax实现浏览器跨域通信

    2019独角兽企业重金招聘Python工程师标准>>> Ajax/XDomainRequest 网络跨域访问控制 jsonp是一种技术手段而不是一种协议,也不是json数据. < ...

  3. ajax跨域访问控制

    ajax跨域访问控制 转载于:https://www.cnblogs.com/macT/p/10214014.html

  4. jfinal里使用ajax,Jfinal解决AJAX的跨域请求

    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful. 一开始使用AJAX来传输json数据时, ...

  5. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  6. VUE -- Mac上解决Chrome浏览器跨域问题

    最近做前端开发总是遇到一个很奇怪的现象,同一个AJAX请求,在Chrome里调试的时候就会提示跨域,但是在手机模拟器或者真机上调试的时候就不会,于是百度了一下,发现是Chrome的安全策略导致的,需要 ...

  7. 记录 关于浏览器跨域和设置默认浏览器的问题

    @Author:Runsen 当你使用ajax访问本地的json文件的时候,就会报from origin 'null' has been blocked by CORS policy: Cross o ...

  8. nginx配置ajax请求跨域

    首先通过mozilla文档了解跨域原理: web跨域的方式有几种,常见的方案有web服务后端代码层级解决与nginx配置层面解决,这里我以nginx配置层面为例. 一般浏览器跨域请求的时候会先发起op ...

  9. ajax+php跨域请求数据库,基于jQuery的ajax跨域请求,PHP作为服务器端代码

    ajax实现跨域请求有两种方式: 方法一:jsonp的方式 jsonp方式的关键点在客户请求以jsonp作为数据类型,服务器端接收jsonp的回调函数,并通过回调函数进行数据的传输.具体代码如下: 客 ...

最新文章

  1. MATLAB 结构型变量
  2. 加密生成指定长度_那些奇奇怪怪的需求(一):PinyinHelper的使用、生成指定长度的随机码...
  3. SharePoint 2010 各个常用级别对象的获取
  4. android ProgressBar 使用方法
  5. C++ std::condition_variable wait() wait_for() 区别
  6. leetcode669. 修剪二叉搜索树
  7. 论文浅尝 | 利用类比推理优化知识图谱向量表示
  8. Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关
  9. 如何查看selenium的版本号
  10. 汇编语言学习--转移指令的原理
  11. Ⅴ0还有别的方法设置图案吗_水冷空调扇如何使用 水冷空调扇使用方法介绍【图文】...
  12. EasyUI的combobox
  13. Excel图表快捷操作小技巧
  14. 自动化测试框架cucumber_10分钟学会 Cucumber+Watir 自动化测试框架
  15. python win32com 批量加密excel 新增sheet 调整sheet顺序
  16. Tmux Cheat Sheet
  17. 面试技巧: 轻松过关10种方法
  18. Altium Designer初学教程(一)
  19. python实例方法不可以用类调用_python中可以直接用类调用方法吗
  20. 基于springboot实现大学生租房系统演示【附项目源码】

热门文章

  1. ScrollView详解
  2. 中国人工智能学会通讯——基于视频的行为识别技术 1.5 基于深度学习的视频识别方法...
  3. AngularJS学习笔记(1) - AngularJS入门
  4. Java中break、continue及标签等跳转语句的使用[下]
  5. CCRD_TOC_2008年第1期
  6. TurboMail邮件系统为防垃圾邮件盗号提供专业方案
  7. Linux 命令(61)—— ldd 命令
  8. 为什么把持久化放到Domain Object是不OO的.
  9. [题解](树形dp/换根)小x游世界树
  10. ubuntu16.04 内核源码编译