目录
① cors响应头 : Access-Control-Allow-Origin
② cors响应头 : Access-Control-Allow-Headers
③ cors响应头 : Access-Control-Allow-Methods
一、为什么会出现跨域问题
出于浏览器的同源策略限制,会出现跨域问题。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。
简单来说,当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
当前页面url | 被请求页面url | 是否跨域 | 原因 |
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https://www.test.com/index.html | 跨域 | 协议不同(http/https) |
http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 端口号不同(8080/7001) |
二、非同源带来的限制
1.无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
2.无法接触非同源网页的 DOM
3.无法向非同源地址发送 AJAX 请求
三、Express中解决跨域问题
1.什么是CORS
CORS全称为Cross-Origin Resource Sharing,翻译为跨域资源共享。由一系列 HTTP 响应头组成,这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源。
浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了 CORS 相关的 HTTP 响应头就可以解除浏览器端的跨域访问限制。
2.使用CORS中间件解决跨域问题
① cors中间件简介
cors是Express的一个第三方中间件。通过安装和注册cors中间件,可以很方便地解决跨域问题。
② cors中间件使用
Ⅰ.安装cors中间件
npm install cors
Ⅱ.导入cors中间件
const cors = require('cors')
Ⅲ.在路由之前调用 app.use(cors()) 配置中间件
app.use(cors())
3.设置响应头,处理跨域请求
① cors响应头 : Access-Control-Allow-Origin
指定允许访问该资源的外域URL,若设置为 *,则允许所有访问,如下仅支持来自http://127.0.0.1:2000的请求。
res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:2000')
② cors响应头 : Access-Control-Allow-Headers
默认情况下,CORS 仅支持客户端向服务器发送如下的 9个请求头Accept、Accept-Language、 Content-Language、DPR、Downlink、Save-Data Viewport-Width、Widt、Content-Type (值仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)。
如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过 Access-Control-Allow-Headers 对额外的请求头进行声明,否则这次请求会失败。
res.header('Access-Control-Allow-Headers', 'Content-Type')
③ cors响应头 : Access-Control-Allow-Methods
默认情况下,CORS仅支持客户端发起 GET、POST、HEAD 请求。如果客户端希望通过 PUT、DELETE 等方式请求服务器的资源,则需要通过 Access-Control-Alow-Methods来指明实际请求所允许使用的 HTTP 方法。若设置为 * ,则允许所有 HTTP 请求方法访问。
res.header('Access-Control-Allow-Methods', 'GET,POST,PUT')