跨域请求
跨域请求就是从另一个域名,而不是资源所在的域名发起的 HTTP 请求。举例来说,在域名 A (http://domaina.example/) 的 HTML 页面上使用 img 元素 (\
) 来请求域名 B (http://domainb.foo/) 上的图片资源。这在当今的 Web 页面上是很常见的 —— 加载跨站点资源,包括 CSS 样式表,图片,脚本和其他资源。CORS 允许 Web 开发人员控制其站点对跨站点请求的反应。
跨域资源共享
跨域资源共享(CORS, Cross-Origin Resource Sharing)是一种机制,该机制使用附加的 HTTP 头(HTTP 消息头用于描述资源或服务器或客户端的行为)来告诉浏览器,准许运行在一个源上的Web应用访问位于另一不同源选定的资源。 当一个Web应用发起一个与自身所在源(域,协议和端口)不同的HTTP请求时,它发起的即跨源HTTP请求。
为什么有跨域请求
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
浏览器的同源策略
同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。
同源的定义:如果两个 URL 的 protocol、port (如果有指定的话)和 host 都相同的话,则这两个 URL 是同源。
| URL | 结果 | 原因 |
|---|---|---|
| http://store.company.com/dir2/other.html | 同源 | 只有路径不同 |
| http://store.company.com/dir/inner/another.html | 同源 | 只有路径不同 |
| https://store.company.com/secure.html | 失败 | 协议不同 |
| http://store.company.com:81/dir/etc.html | 失败 | 端口不同 ( http:// 默认端口是80) |
| http://news.company.com/dir/other.html | 失败 | 主机不同 |
浏览器将CORS跨域请求分为简单请求和非简单请求。
简单请求
只要同时满足以下两个条件,就属于简单请求。
- 1.使用下列方法之一:
head
get
post - 2.请求的Heder是
Accept
Accept-Language
Content-Language
Content-Type: 只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain
不同时满足以上两个条件,都属于非简单请求览器对这两种的处理是不一样的。
对于简单请求,浏览器直接发出CORS请求,对于非简单请求,在正式通信之前,会增加一次HTTP查询请求,成为“预检”请求。
如何处理跨域问题
后端
可以在后台配置中允许跨域。如果使用nginx,可以在location p(nginx header configure)那里增加header(http header),允许跨域。
例如:location /static { add_header 'Access-Control-Allow-Origin' '*'; root /usr/www/financial_report/; # 静态资源目录 autoindex on; # 是否支持打开目录 }
前端
目前我只对vue有部分了解,所以,这里列举一个vue的例子。可以使用deveServer.proxy,简单配置如下:
module.exports = { devServer: { proxy: 'http://127.0.0.1:81' } }
与jsonp 比较
CORS与JSONP的使用目的相同,但是比JSONP更强大。
JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
) 来请求域名 B (