背景
之前在做web站点优化,遇到了一些跨域问题,在网上查了一些资料,现在整理一下。
本文主要参考了知乎https://www.zhihu.com/question/26376773
跨域介绍
跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。
跨域的严格一点的定义是:只要 协议、域名或端口有任何一个的不同,就被当作是跨域
以下面2个地址来说明,红色是协议,绿色是域名,蓝色是端口号。如果不写端口,实际用的是默认端口号(http默认80端口,https默认443端口)
http://www.baidu.com/aaa 等同于http://www.baidu.com:80/aaa
https://www.google.com:8990/bbbb
常见的解决方案
之前在做web站点优化,遇到了一些跨域问题,在网上查了一些资料,现在整理一下。
1.Jsonp
2.跨域资源共享(CORS)
3.代理
4.其它(iframe、window.name、postMessage等等)
因为CORS只需要修改服务端的header,所以我们项目实际使用的是CORS,下面只介绍CORS
CORS介绍
CORS(Cross-Origin Resource Sharing, 跨源资源共享)是W3C出的一个标准,CORS让Web应用服务器能支持跨站访问控制,使跨站数据传输更加安全,减轻跨域HTTP请求的风险。CORS验证机制需要客户端和服务端协同处理。
CORS浏览器支持情况
服务端配置
返回信息(Response)的header加上如下几项
access-control-allow-origin
access-control-allow-headers
access-control-allow-methods
CORS请求分类
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)
1.简单请求
同时满足如下条件,就属于简单请求。
methond:[HEAD, GET, POST]
Head:[Accept, Accept-Language, Content-Language, Last-Event-ID, Content-Type]
Content-Type:[application/x-www-form-urlencoded, multipart/form-data, text/plain]
2.非简单请求
非简单请求实际是2个请求,需要先发一个option请求