-
Notifications
You must be signed in to change notification settings - Fork 5
跨域总结 #199
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
CORS词条:
一、引入背景浏览器端JS中的http请求( 除了
二、CORS原理21 浏览器和服务端的谈判互怼阶段 甩锅阶段 2.2 简单请求不会对服务端数据产生副作用的HTTP请求视为简单请求。具体规则:符合一定条件的请求 2.2.1 简单请求处理流程浏览器会直接发生真实请求。具体步骤:
2.2.2 携带
|
一、何为跨域
源(Origin):协议+主域+端口;
同源(Same Origin):协议,域名,端口三者都相同视为同源;
跨域:是指资源的源和文档的源不同。
二、受跨域影响资源
2.1 不受同源策略限制的
<script>
<link>
<iframe>
<img>
<video>
Form
表单提交。2.2 受同源策略限制范围
跨域脚本API访问(不同源的DOM操作);
跨域数据存储访问:Cookie,Storage,(?IndexedDB,ApplicationCache,CacheStorage);
JS Http请求(
XMLHttpRequest
,fetch
);@font-face
;字体是版权比较敏感的资源。
总体分为:
三、客户端跨域文档之间通讯
3.1 跨文档数据访问
JS中可以通过
iframe.contentWindow
,window.open
,window.opener
,window.parent
等API进行文档间的交互。但这只限于同源文档之间,非同源之间不能交互。除了DOM API外,还有其他
localStorage
,sessionStorage
等本地缓存数据也受同源限制。本质上跨文档DOM API访问目的是为了数据交换,所以也属于跨文档数据访问。
页面URL:
http://localhost:8082/crossOrigin/home.html
跨域情况下除了
postMessage
函数外,不可以访问contentWindow
对象的任何属性。3.2 解决方案
window.name
可用于页面跳转时的跨文档数据通信。
Home页面
Detail页面:
window.name
可以保存大数据;之前看有框架在浏览器无痕模式下把本地缓存数据(MemoryStorage)都保存在
window.name
里。只能保存字符串数据;
一般是把对象转成JSON字符串保存。
文档和内嵌
iframe
之前无法使用window.name
进行通信,因为两个文档的全局对象window
是不同的。3.3 终极解决方案
Window.postMessage()
HTML5引入的API专门用于解决跨域文档之间的通讯,本质是跨域文档之间的
window
对象之间通讯:只适用于:
iframe
;语法
postMessage
是唯一可以跨域文档访问的API(必须得特殊处理,要不然怎么通讯呢)。message
& 结构化克隆算法并不是任意数据都可以传递的,具体见Things that don't work with structured clone
lastIndex
属性。targetOrigin
指定目标window的
origin
。targetOrigin
除了可以是origin
外还可以是个URL,此时浏览器自动获取URL里的origin
(不是直接使用URL匹配)。targetOrigin
默认值通配符"*",只有同域时使用通配符才能正常发消息;targetOrigin
指定的origin
和当目标window的origin
匹配时(大小写不敏感)才能发消息;origin
白名单,即只处理白名单origin
发的消息。Transferable
代表一个能在不同可执行上下文之间,列如主线程和
Worker
之间,相互传递的对象。主要用于管道通讯中转移
MessagePort
等。MessageEvent
比较重要的属性:
消息发送者对象。可以是window, ServiceWorder, MessagePort。
MessageChannel
MessageChannel
是Window.postMessage()
背后的原理。利用
MessageChannel
可以自定义管道通讯。MessagePort
必须调用start
方法才能发消息;通过
MessagePort.onmessage
绑定事件时会内部调用start
方法。利用EventTarget.addEventListener
绑定事件需要手动调用start
方法。window.postMessage
内部也利用MessageChannel
通讯,不过增加了origin
的判断。其他应用
window.postMessage
和MessageChannel
除了用于管道通讯外,还有一些其他使用场景。setImmediate
的polyfill四、客户端和跨域服务端通讯
4.1 jsonp
4.3 CORS
The text was updated successfully, but these errors were encountered: