跨域-jsonp、cors、iframe、document.domain、postMessage()
同源策略
概念:同源: 协议、域名、端口号 完全相同
同源策略是浏览器的一种安全策略;且浏览器不会将违反同源策略的响应信息返回
http://127.0.0.1:3000/index.html http://127.0.0.1:3000/hello.html
http://localhost:3000/hello.html https://localhost:3000/hello.html
eg: 协议名--- http、https 域名--- 127.0.0.1、localhost
不同源
概念:协议名、域名、端口有其一不同,即不同源;
跨域:js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,只要协议、域名、端口有任何一个不同,都被当作是不同的域。
简言之,不同源就是跨域,
1.JSONP
全称:JSON with Padding;
作用:利用一些HTML标签天生的跨域能力来发送跨域请求的 eg:img、script、link
缺点:JSONP只能发送get请求,不能发送post请求,且JSONP不是官方的跨域解决方案
原理:
原生js :
原理:
① 首先当前页面中声明有一个函数,dosomething
② 借助 <script><img><iframe> 等标签可以引入不同域资源的特性,将需要发送的请求的路径作为src参数,且带上将之前约定好的回调函数名,callback=dosomething
③ 服务端接收到请求后,就会返回一端 js代码,在 js代码中调用了约定好的回调函数,并且需要返回的数据作为回调函数的参数dosomething([a,,b,c])
④ 当网页接收到这段 js 代码,则执行这个回调函数,这时数据已经成功传输到客户端了。
jQuery
* 客户端 url?callback=?
* 服务器端
var callback = req.query.callback ----返回的value需要封装成jsonObj
res.send(callback+'('+jsonObj+')');
$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。
2.CORS
全称:Cross-Origin Resource 跨域资源共享
优点:CORS是官方的跨域解决方案,且使用CORS不需要在客户端做任何修改,直接发送AJAX请求即可
CORS支持get/post请求;IE8以下不支持
方法:通过服务器设置一个响应头来告诉浏览器允许跨域请求
res.sendHeader(‘Access-Control-Allow-Origin’,’请求地址’)
允许所有的跨域请求 用 * 即 res.sendHeader(‘Access-Control-Allow-Origin’, ’*’ )
response.setHeader(Access-Control-Allow-Credentials:true) //-可选-设置是否允许发送cookie
response.setHeader(Access-Control-Allow-Methods:‘post’、‘get’)
response.addHeader(Access-Control-Max-Age: 600) 注:单位是秒
response.addHeader(Access-Control-Allow-Headers:origin, x-requested-with出现的首部信息)
3.iframe
window.name + iframe ==> http://www.tuicool.com/articles/viMFbqV,支持跨主域。不支持POST
在iframe中获取父级内容
同理,在同域下,父页面可以获取子iframe的内容,那么子iframe同样也能操作父页面内容
4.document.domain来跨子域
例如 a.qq.com嵌套一个b.qq.com的iframe ,如果a.qq.com设置document.domain为qq.com 。b.qq.com设置document.domain为qq.com,那么他俩就能互相通信了,不受跨域限制了。
注意:只能跨子域
5.postMessage()
window.postMessage(message,targetOrigin) 此方法是html5新引进的特性,
优点:可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源(目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持)。
缺点:缺点是IE6、IE7不支持,所以用不用还得根据实际需要来决定。
具体来说:调用postMessage方法的window对象是指要接收消息的那一个window对象,通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。
第一个参数message为要发送的消息,类型只能为字符串;
第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 * 。
<script>
function onLoad(){
var iframe = document.getElementById('iframe');
var obj = iframe.contentWindow;
obj.postMessage('我是来自a的信息哦',‘*’)
}
</script>
<iframe id="iframe" src='http://www.test.com/b.html' onload="onLoad()"></iframe>
<script>
window.onmessage = function (e){
event = event ||e
console.log(e.data) //通过data属性得到a传来的信息
}
</script>
跨域-jsonp、cors、iframe、document.domain、postMessage()的更多相关文章
- 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...
- 跨域(四)——document.domain
浏览器有一个合法的性质:一个页面可以设置document.domain为当前子域或比当前子域更高级的域.一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误. 利用这个性质,我们可以通过设置do ...
- [跨域]js设置document.domain实现跨域
document.domain用来得到当前网页的域名.比如在地址栏里输入: 代码如下: javascript:alert(document.domain); //www.jb51.net 我们也可以给 ...
- python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...
- js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限 ...
- js 跨域复习 window.name | window.domain | iframe | Jsonp
引起跨域的原因: 浏览器的同源策略,但是当你要发送请求的时候,出于安全性问题,浏览器有严格的要求,必须协议,域名,端口都相同,这个就是同源策略. 影响:a通过js脚本向b发送ajax请求,不同源就会报 ...
- JS跨域:jsonp、跨域资源共享、iframe+window.name
JS跨域:jsonp.跨域资源共享.iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html JS中的跨域 请求跨域有 ...
- 跨域资源共享CORS与JSONP
同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...
- 小结ajax中的同源和跨域 jsonp和cors
网上的同源和跨域一般都比较复杂,最近也稍微总结了一下: 所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为 同源的条件:1.协议相 ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
随机推荐
- 完整安装sqlserver always on集群
准备工作 1. 四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...
- Findbugs分析工具介绍
Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.Findbugs自带检测器,其中有60余种Bad practice,80余种Correct ...
- UVa修改版02
#include<stdio.h> int main() { int i,k=-1,t; char a[100]; scanf("%d",&t); while( ...
- CorelDRAW购物节福利开奖 | “剁手节”前的攻略来了,请查收!
距离“剁手节” 还有不到两周的时间 相信一些线上.线下.微商.电商...都拿出了看家本领进行市场混战 一场没有硝烟的战争开始啦!! …… 当然,我也不例外 你们谁都别拦着,我要打广告了 让你变成了不折 ...
- 【udacity】机器学习-2模型验证
Evernote Export 1.模型的评估与验证简介 机器学习通常是大量传入数据,然后会有一些关于数据的决策.想法和摘要. 2.模型评估 评估模型使用的是各种数据分析的方法,至少需要使用pytho ...
- tomcat-manager 设置
tomcat默认是没有用户登录控制的,需要登录manager,则需要配置角色与用户 1. 在conf/tomcat-users.xml中添加 <role rolename="manag ...
- Win 10安装mysql以及常见问题总结
一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...
- springboot使用aop做日志
一.引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- CSS - Span 下的width设置不可用?
解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...
- [GSS5] Can you answer these queries V
大力讨论. luogu上交spoj的题卡的一比... 难受 wa了好几次,原因大概首先求的是非空区间,不能乱和0取max,第二点是求无相交的解时,在两段求lmx和rmx的时候可以取max(0). 区间 ...