同源策略

概念:同源: 协议、域名、端口号 完全相同

同源策略是浏览器的一种安全策略;且浏览器不会将违反同源策略的响应信息返回

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()的更多相关文章

  1. 什么是同源策略,什么是跨域,如何跨域,Jsonp/CORS跨域

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. 可以说Web是构建在同源策略基础之上 ...

  2. 跨域(四)——document.domain

    浏览器有一个合法的性质:一个页面可以设置document.domain为当前子域或比当前子域更高级的域.一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误. 利用这个性质,我们可以通过设置do ...

  3. [跨域]js设置document.domain实现跨域

    document.domain用来得到当前网页的域名.比如在地址栏里输入: 代码如下: javascript:alert(document.domain); //www.jb51.net 我们也可以给 ...

  4. python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

  5. js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)

    一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限 ...

  6. js 跨域复习 window.name | window.domain | iframe | Jsonp

    引起跨域的原因: 浏览器的同源策略,但是当你要发送请求的时候,出于安全性问题,浏览器有严格的要求,必须协议,域名,端口都相同,这个就是同源策略. 影响:a通过js脚本向b发送ajax请求,不同源就会报 ...

  7. JS跨域:jsonp、跨域资源共享、iframe+window.name

    JS跨域:jsonp.跨域资源共享.iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html JS中的跨域 请求跨域有 ...

  8. 跨域资源共享CORS与JSONP

    同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...

  9. 小结ajax中的同源和跨域 jsonp和cors

    网上的同源和跨域一般都比较复杂,最近也稍微总结了一下: 所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为 同源的条件:1.协议相 ...

  10. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

随机推荐

  1. 完整安装sqlserver always on集群

    准备工作 1.  四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...

  2. Findbugs分析工具介绍

    Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.Findbugs自带检测器,其中有60余种Bad practice,80余种Correct ...

  3. UVa修改版02

    #include<stdio.h> int main() { int i,k=-1,t; char a[100]; scanf("%d",&t); while( ...

  4. CorelDRAW购物节福利开奖 | “剁手节”前的攻略来了,请查收!

    距离“剁手节” 还有不到两周的时间 相信一些线上.线下.微商.电商...都拿出了看家本领进行市场混战 一场没有硝烟的战争开始啦!! …… 当然,我也不例外 你们谁都别拦着,我要打广告了 让你变成了不折 ...

  5. 【udacity】机器学习-2模型验证

    Evernote Export 1.模型的评估与验证简介 机器学习通常是大量传入数据,然后会有一些关于数据的决策.想法和摘要. 2.模型评估 评估模型使用的是各种数据分析的方法,至少需要使用pytho ...

  6. tomcat-manager 设置

    tomcat默认是没有用户登录控制的,需要登录manager,则需要配置角色与用户 1. 在conf/tomcat-users.xml中添加 <role rolename="manag ...

  7. Win 10安装mysql以及常见问题总结

    一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...

  8. springboot使用aop做日志

    一.引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  9. CSS - Span 下的width设置不可用?

    解决:Span 下的width设置不可用? 内联元素-span有根据内容自动伸缩的能力,当需要对其宽度设定时,出现无效的情况. Demo:http://jsfiddle.net/JSDavi/ad62 ...

  10. [GSS5] Can you answer these queries V

    大力讨论. luogu上交spoj的题卡的一比... 难受 wa了好几次,原因大概首先求的是非空区间,不能乱和0取max,第二点是求无相交的解时,在两段求lmx和rmx的时候可以取max(0). 区间 ...