使用CORS解决跨域问题

120 阅读1分钟

一、浏览器的同源策略

img_v3_027h_85a38ab8-5f5d-4abd-8c4e-97c290421b6g.jpg

二、CORS

Cross-Orign Resource Sharing
Cors是一套机制,用于浏览器校验跨域请求
它的基本理念是:
只要服务器明确表示允许,则校验通过
服务器明确拒绝或没有表示,则校验不通过

使用CORS方案的前提, 必须保证服务器是「自己人」

三、简单请求与预检请求

CORS将请求分为两类:

1. 简单请求
  • 请求方法为GETHEADPOST
  • 头部字段满足CORS安全规范,详情(简单理解为不修改请求头)
  • 请求头的Content-Type为text/plainmultipart/form-dataapplication/x-www-form-urlencoded
fetch('https://douyin.com');
fetch('https://douyin.com', {
    method: 'POST',
    body: JSON.stringify({ a: 1, b: 2 }),
});
2. 预检请求

其他请求为预检请求

fetch('https://douyin.com', {
    headers: {
        a: 1
    }
});
fetch('https://douyin.com', {
    method: 'POST',
    headers: {
        'Content-type': 'applican/json'
    },
    body: JSON.stringify({ a: 1, b: 2 }),
});

四、处理方法

1. 简单请求

img_v3_027h_9e0b64d4-95a1-41d4-8267-7e4d1044018g.jpg

简单请求会在请求时携带Origin头,代表当前页面的域是什么,源是什么。如果服务器允许访问,则在响应时添加Access-Control-Allow-Origin头,携带与当前页面相同的域即可,或者*允许所有的源进行访问。

2. 预检请求

img_v3_027h_8e2d5ff8-bce6-4a44-b2cc-e71f1ba8b56g.jpg

首先发送一个预检请求,携带Origin头表示当前域,Access-Control-Allow-Methods头表示待请求的方法,Access-Control-Request-Headers表示修改了哪些头,然后服务器自行判断是否通过,如果服务器允许通过的话则返回Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers,设置允许的域、请求方法与改变的头。然后发送真实请求。