Skip to content

Latest commit

 

History

History
68 lines (33 loc) · 2.64 KB

跨域.md

File metadata and controls

68 lines (33 loc) · 2.64 KB

解决跨域的方法

1.在webpack的devserver的proxy配置"/api":{target:url}

2.浏览器配置:关闭浏览器的安全策略

3.JsonP 本质是利用script标签允许跨域

4.cors

cors需要浏览器和服务器同时支持,整个cors通信过程都是浏览器自动完成,不需要用户参与,关键实现是服务器,只要服务器实现了cors接口,就可以跨源通信

两种请求:

1.简单请求 满足以下两大条件就是简单请求:HEAD,GET,POST

头信息不超出以下几种字段:

1.accept

2.accept-language

3.content-language

4.last-Event-ID

5.content-type:'application/x-www-form-urlencoded'||'multipart/form-data'||'text/plain'

满足简单请求,浏览器直接发出cors请求,就是在头信息加一个origin字段,服务器根据这个值,决定是否同意这次请求。

如果origin的域名在许可范围内,服务器返回的响应,会多出几个头信息字段

Access-Control-Allow-Origin: http://api.bob.com

Access-Control-Allow-Credentials: true

Access-Control-Expose-Headers: FooBar

Content-Type: text/html; charset=utf-8

2.非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,预检请求。

浏览器先询问服务器,当网页所在的的域名是否在服务器许可名单之中,以及可以使用哪些HTTP动词和头部信息,只有得到肯定的答复,

浏览器才会发出正式的XMLHttpRequest请求,否则报错。

浏览器如果发现这是一个非简单请求,就自动发送一个预检请求,要求服务器可以这样请求,预检用的是options,表示这个请求是用来询问的。

5.document.domain(同一基础域名之间的"跨域")

一个页面框架(iframe/frame)之间,是能够获取到彼此的window对象的,但是这个window拿不到方法和属性,但是如果两个域名的主域名和端口号一致的话, 可以设置他们的document.domain为一致域名,这样可以骗过浏览器的限制,达到跨子域的效果

前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域

6.window.name

window对象有个name属性,该属性有个特征,在一个窗口的生命周期内,窗口载入的所有页面都是一个window.name的,每个页面对window.name都有读写的权限, window.name是持久存在一个窗口载入过的所有页面中的,并不会因为新页面的载入而重置