跨域

2017-09-15  本文已影响0人  简人CC

同domain(或IP),同端口,同协议视为同一个域。一个域名下的脚本仅仅拥有本域内的权限,可以获取下的资源,而无法访问其他域的资源。这种安全限制成为同源策略
举例来说 http://www.example.com/dir/page.html这个网址.协议是http://,域名是www.example.com,端口默认是80(默认端口可以省略)它的同源情况如下:
-http://www.example.com/dir/other.html :同源
-http://example.com/dir/other.html :不同源(域名不同)
-http://v2.www.example.com/dir/other.html :不同源(域名不同)
-http://www.example.com:81/dir/other.html :不同源(端口不同)

只要协议 端口 IP 有一个不同,都被当成不同的域。
CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器如何沟通。CORS 基本思想就是使用了自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。

var xhr = new XMLHttpRequest()
xhr.onreadystatechange=function(){}
xhr.open('get','https://www.baidu.com/',true)
xhr.end(null)

jsonp只能get

  • 通过动态创建script标签来构造请求
浏览器发出请求
var el = docuemnt.createElement('script‘)
el.src='https://baidu.com/user?callback=fn'
document.body.appendChild(el)

后端响应并截取callback对应的值
通过一系列手段 向 浏览器返回 fn('{"name":'23"}')

这时浏览器对应有一个全局函数window.fn=function(){}->fn=function(){}
就相当于调用了fn这个函数,并把数据当参数传递。就进行了‘跨域’

 1. 在页面 http://www.expamle.com/a.html中设置document.domain
<iframe id="iframe" src="http://example.com/b.thml">
<script type="text/javascript">
 documetn.domain="example.com"
 function test(){
alert(document.getElementById('iframe').contentWindow)
}
2. 在页面 http://expamle.com/a.html中设置document.domain
<iframe id="iframe" src="http://example.com/b.thml">
<script type="text/javascript">
 documetn.domain="example.com"
 function test(){
alert(document.getElementById('iframe').contentWindow)
}

window.postMessage(message,targetorigin)方法是html5新引进的特性。可以使用它来想其他的window对象发送消息。无论这个window对象是同源还是不同源。

jsonp只能get

通过动态创建script标签来构造请求
var el = docuemnt.createElement('script‘)
el.src='https://baidu.com/user?callback=fn'
document.body.appendChild(el)

后端响应并截取callback对应的值
通过一系列手段 向 浏览器返回 fn('{"name":'23"}')

这时浏览器对应有一个全局函数window.fn=function(){}->fn=function(){}
就相当于调用了fn这个函数,并把数据当参数传递。就进行了‘跨域’

题目4: CORS是什么

CORS(Cross-Origin Resource Sharing),定义了在必须访问跨域资源时,浏览器与服务器要如何沟通。原理是使用自定义的的HTTP头部让浏览器与服务器沟通,从而决定请求或相应是否成功。比如在发送一个简单的get请求时,需要给它附加一个额外的origin头部,其中包含请求页面的源信息(协议 端口 域名),以便让服务器根据这个头部信息决定是否给予响应。
比如发送了一个origin头部:
Origin: http://www.jirengu.com:8080
如果服务器(后端)认为这个请求可以接受,就在Access-Control-Allow-Origin头部中发回相同的源信息:
Access-Control-Allow-Origin: http://www.jirengu:8080.com(与请求相同)

上一篇 下一篇

猜你喜欢

热点阅读