




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前端解决跨域问题的 8 种方案(最新最全) 2013-10-31 19:25 阅读(933) 评论(8) 编辑 收藏 1.同源策略如下: URL 说明 是否允许通信 /a.js /b.js 同一域名下 允许 /lab/a.js /script/b.js 同一域名下不同文 件夹 允许 :8000/a.js /b.js 同一域名,不同端 口 不允许 /a.js /b.js 同一域名,不同协 议 不允许 /a.js 4/b.js 域名和域名对应 ip 不允许 /a.js /b.js 主域相同,子域不 同 不允许 /a.js /b.js 同一域名,不同二 级域名(同上) 不允许(cookie 这种情 况下也不允许访问) /a.js /b.js 不同域名 不允许 特别注意两点: 第一,如果是协议和端口造成的跨域问题“前台” 是无能为力的 , 第二:在跨域问题上,域仅仅是通过“URL 的首部”来识别而不会去尝试判断相同的 ip 地址 对应着两个域或两个域是否在同一个 ip 上。 “URL 的首部 ”指 tocol +window.location.host,也可以理解为 “Domains, protocols and ports must match”。 2. 前端解决跨域问题 1 document.domain + iframe (只有在主域相同的时候才能使用该 方法) 1) 在 /a.html 中: document.domain = ; var ifr = document.createElement(iframe); ifr.src = /b.html; ifr.display = none; document.body.appendChild(ifr); ifr.onload = function() var doc = ifr.contentDocument | ifr.contentWindow.document; /在这里操作 doc,也就是 b.html ifr.onload = null; ; 2) 在 /b.html 中: document.domain = ; 2 动态创建 script 这个没什么好说的,因为 script 标签不受同源策略的限制。 function loadScript(url, func) var head = document.head | document.getElementByTagName(head)0; var script = document.createElement(script); script.src = url; script.onload = script.onreadystatechange = function() if(!this.readyState | this.readyState=loaded | this.readyState=complete) func(); script.onload = script.onreadystatechange = null; ; head.insertBefore(script, 0); window.baidu = sug: function(data) console.log(data); loadScript(/su?wd=w,function()console.l og(loaded); /我们请求的内容在哪里? /我们可以在 chorme 调试面板的 source 中看到 script 引入的内容 3 location.hash + iframe 原理是利用 location.hash 来进行传值。 假设域名 下的文件 cs1.html 要和 域名下的 cs2.html 传递信息。 1) cs1.html 首先创建自动创建一个隐藏的 iframe,iframe 的 src 指向 域名下 的 cs2.html 页面 2) cs2.html 响应请求后再将通过修改 cs1.html 的 hash 值来传递数据 3) 同时在 cs1.html 上加一个定时器,隔一段时间来判断 location.hash 的值有没有变化, 一旦有变化则获取获取 hash 值 注:由于两个页面不在同一个域下 IE、Chrome 不允许修改 parent.location.hash 的值,所 以要借助于 域名下的一个代理 iframe 代码如下: 先是 下的文件 cs1.html 文件: function startRequest() var ifr = document.createElement(iframe); ifr.style.display = none; ifr.src = /lab/cscript/cs2.html#paramdo; document.body.appendChild(ifr); function checkHash() try var data = location.hash ? location.hash.substring(1) : ; if (console.log) console.log(Now the data is +data); catch(e) ; setInterval(checkHash, 2000); 域名下的 cs2.html: /模拟一个简单的参数处理操作 switch(location.hash) case #paramdo: callBack(); break; case #paramset: /do something break; function callBack() try parent.location.hash = somedata; catch (e) / ie、chrome 的安全机制无法修改 parent.location.hash, / 所以要利用一个中间的 cnblogs 域下的代理 iframe var ifrproxy = document.createElement(iframe); ifrproxy.style.display = none; ifrproxy.src = /test/cscript/cs3.html#somedata; / 注意该文件在““域下 document.body.appendChild(ifrproxy); 下的域名 cs3.html /因为 parent.parent 和自身属于同一个域,所以可以改变其 location.hash 的值 parent.parent.location.hash = self.location.hash.substring(1); 4 + iframe 的美妙之处:name 值在不同的页面(甚至不同域名)加载后依旧存在, 并且可以支持非常长的 name 值(2MB)。 1) 创建 /cs1.html 2) 创建 /proxy.html,并加入如下代码 function proxy(url, func) var isFirst = true, ifr = document.createElement(iframe), loadFunc = function() if(isFirst) ifr.contentWindow.location = /cs1.html; isFirst = false; else func(ifr.contentW); ifr.contentWindow.close(); document.body.removeChild(ifr); ifr.src = ; ifr = null; ; ifr.src = url; ifr.style.display = none; if(ifr.attachEvent) ifr.attachEvent(onload, loadFunc); else ifr.onload = loadFunc; document.body.appendChild(iframe); proxy(/, function(data) console.log(data); ); 3 在 /cs1.html 中包含: = 要传送的内容; 5 postMessage(HTML5 中的 XMLHttpRequest Level 2 中的 API) 1) /index.html 中的代码: window.onload = function() var ifr = document.getElementById(ifr); var targetOrigin = ; / 若写成 /c/proxy.html效果一样 / 若写成就不会 执行 postMessage 了 ifr.contentWindow.postMessage(I was there!, targetOrigin); ; 2) /index.html 中的代码: window.addEventListener(message, function(event) / 通过 origin 属性判断消息来源地址 if (event.origin = ) alert(event.data); / 弹出“I was there!“ alert(event.source); / 对 、index.html 中 window 对 象的引用 / 但由于同源策略,这里 event.source 不可以访问 window 对象 , false); 6 CORS CORS 背后的思想,就是使用自定义的 HTTP 头部让浏览器与服务器进行沟通,从而决定 请求或响应是应该成功,还是应该失败。 IE 中对 CORS 的实现是 xdr var xdr = new XDomainRequest(); xdr.onload = function() console.log(xdr.responseText); xdr.open(get, ); xdr.send(null); 其它浏览器中的实现就在 xhr 中 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () if(xhr.readyState = 4) if(xhr.status = 200 var script = document.createElement(script); script.src = /json/?callback=handleResponse; document.body.insertBefore(script, document.body.firstChild); /*handleResonse(“data“: “zhe“)*/ /原理如下: /当我们通过 script 标签请求时 /后台就会根据相应的参数(json,handleResponse) /来生成相应的 json 数据(handleResponse(“data“: “zhe“) /最后这个返回的 json 数据(代码)就会被放在当前 js 文件中被执行 /至此跨域通信完成 jsonp 虽然很简单,但是有如下缺点: 1)安全问题(请求代码中可能存在安全隐患) 2)要确定 jsonp 请求是否失败并不容易 8 web sockets web sockets 是一种浏览器的 API,它的目标是在一个单独的持久连接上提供全双工、双 向通信。(同源策略对 web sockets 不适用) web sockets 原理:在 JS 创建了 web
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物流运输行业假期旅游证明(5篇)
- 农村社区小区土地合作开发协议
- 餐饮业智能点餐与外卖服务平台构建方案
- 行政管理中市政学的关键试题及答案
- 商场营业外包服务协议
- 市政学综合复习试题及答案
- 行政管理自考考试形式试题及答案讲解
- 行政管理困境与策略试题及答案
- 2025产权合同专利权转让合同
- 代际差异对团队管理的影响试题及答案
- 《华能企业文化建设》课件
- 陕西延安通和电业有限责任公司招聘笔试真题2024
- 2025年医院管理专业研究生入学考试试卷及答案
- 2025年江苏高处安装、维护、拆除作业-特种作业证考试复习题库(含答案)
- 2025年湖北省黄冈市中考数学调研试卷(4月份)
- Unit7OutdoorfunIntegration(课件)-译林版(2024)英语七年级下册
- 2023年船员培训计划
- 2025中国铁路郑州局集团招聘614人(河南)笔试参考题库附带答案详解
- 陪玩店合同协议
- 货运司机雇佣合同协议
- 超合同30签补充协议
评论
0/150
提交评论