跨域-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)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
随机推荐
- RFID 知识的学习
* 部分资料来自我们博士的PPT,部分来自网络和他人的论文. * 我们使用的教材是清华大学出版社出版的<智能卡技术(第四版)——IC卡.RFID标签与物联网(清华大学计算机系列教材)>(王 ...
- 安装mysql-python的遇到的问题
最近更新环境后遇到安装mysql-python的问题,感觉挺折腾的,记录一下. 安装mysql-python的时候一直提示下面的错误 _mysql.c() : fatal error C1083: C ...
- 03--软件包管理工具 apt
APT APT(the Advanced Packaging Tool)是Ubuntu 软件包管理系统的高级界面,由几个名字以“apt-”打头的程序组成.apt-get.apt-cache ...
- matlab学习创建变量定义函数
定义变量a,b,c,计算输出d >> a=-3;b=2;c=5;>> d=(a^2+b)/c;>> d=(a^2+b)/c d = 2.2000 系统默认变量 a ...
- Swoole 同步模式与协程模式的对比
在现代化 PHP 高级开发中,Swoole 为 PHP 带来了更多可能,如:常驻内存.协程,关于传统的 Apache/FPM 模式与常驻内存模式(同步)的巨大差异,之前我做过测试,大家能直观的感受到性 ...
- jsp三层架构
学了.net了,它的三层架构很好用.现在学jsp,我们一样可以用三层架构来开发.下面详细介绍 1.创建数据库 drop table MyUser create table MyUser ( id ,1 ...
- String 基本使用方法, 以及要注意的事项
package chengbaoDemo; public class Test01 { public static void main(String[] args) { //字符串的两种创建形式 St ...
- NEFU 119
和上一题一样,注意除不尽为0 #include <iostream> #include <cstdio> #include <cstring> #include & ...
- CSU 1541 There is No Alternative (最小生成树+枚举)
题目链接:传送门 题意: 有n个点.m条边.要使n个点所有连起来且要花费最小.问有哪些边是必需要连的. 分析: 要使花费最小肯定是做最小生成树.可是题目要求哪些边是必需要用的.我们能够 这样思考,我们 ...
- Linux内核project导论——网络:Netfilter概览
简单介绍 最早的内核包过滤机制是ipfwadm.后来是ipchains.再后来就是iptables/netfilter了. 再往后,也就是如今是nftables. 只是nftables与iptable ...