目录
一、什么是跨域
请求url的协议、域名、端口三者有任意一个不同即为跨域。跨域问题是因为浏览器的同源策略的限制而产生的。
-
同源:请求url的协议、域名、端口三者都相同即为同源(同一个域)。
-
同源策略:同源策略(Sameoriginpolicy)是一种约定,他是浏览器最核心也最基本的安全功能。同源策略会阻止非同源(同一个域)的内容进行交互。
同源策略的限制:
- 无法读取非同源网页的Cookie、LocalStorage和IndexedDB
- 无法接触非同源网页的DOM
- 无法向非同源地址发送AJAX请求
浏览器的同源策略会限制跨域请求,限制的方式一般有两种:
- 浏览器限制发起跨域请求;
- 跨域请求可以正常发起,但是返回的结果被浏览器拦截了。
一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。
为了防止这种情况的发生,规范要求,对这种可能对服务器数据产生副作用的HTTP请求方法,浏览器必须先使用OPTIONS方法发起一个预检请求,从而获知服务器是否允许该跨域请求:如果允许,就发送带数据的真实请求;如果不允许,则阻止发送带数据的真实请求。
二、跨域资源共享(CORS)
解决非同源内容无法交互的问题,目前主流的解决方案就是:CORS(跨域资源共享)。
跨域资源共享(Cross-origin Resource Sharing)简称CORS,它突破了一个请求在浏览器发出只能在同源的情况下向服务器获取数据的限制。
CORS约定服务器端和浏览器在HTTP协议之上,通过一些额外HTTP头部信息,进行跨域资源共享的协商。服务器端和浏览器都必需遵循规范中的要求。
CORS把HTTP的跨域请求分成两类,简单请求和非简单请求,不同请求按照不同的策略进行跨域资源共享协商。
1. 简单请求
简单跨域请求需满足的条件