网络安全-跨域-2:如何解决跨域-CORS
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⽹络安全-跨域-2:如何解决跨域-CORS
1.CORS - 跨域资源共享
在CORS中会有简单请求和复杂请求的概念
浏览器⽀持情况
当你使⽤IE<=9, Opera < 12 或者 Firefox < 3.5或者更⽼的浏览器,这个时候请使⽤JSONP
a.简单请求
不会触发CORS预检请求,这样的请求为简单请求,满⾜以下条件,则该请求视为简单请求
情况⼀使⽤以下⽅法(以下请求以外的都是⾮简单请求):
GET
HEAD
POST
情况⼆:⼈为设置以下集合外的请求头:
Accept
Accept-Language
Content-Language
Content-Type (需要注意额外的限制)
DPR
Downlink
Save-Data
Viewport-Width
Width
情况三:Content-Type的值仅限于下列三者之⼀:(例如 application/json 为⾮简单请求)
text/plain
multipart/form-data
application/x-www-form-urlencoded
情况四:
请求中的任意XMLHttpRequestUpload对象均没有注册任何事件监听器;XMLHttpRequestUpload对象可以使⽤XMLHttpRequest.upload属性访问。
情况五:
请求中没有使⽤ReadableStream对象
b.⾮简单请求
除以上情况以外的
c.Node中的解决⽅案
原⽣⽅式
后端部分的解决⽅案. Node中的CORS的代码解决
e(async(ctx,next)=>{
ctx.set('Access-Control-Allow-Origin',in);
ctx.set('Access-Control-Allow-Credentials',true);
ctx.set('Access-Control-Request-Method','PUT,POST,GET,DELETE,OPTIONS')
ctx.set('Access-Control-Allow-Headers','Orgin,X-Requested-With, Content-Type,Accept,cc')
if(ctx.method === 'OPTIONS'){
ctx.status = 204;
return;
}
await next()
})
第三⽅中间件
const cors = require("koa-cors");
e(cors());
关于 cors 的 cookie 问题
想要传递cookie需要满⾜3个条件
条件1. web请求设置withCredentials: 默认情况下在跨域请求,浏览器是不带cookie的。
但是我们可以通过设置withCredentials来进⾏传递cookie
// 原⽣ xml 的设置⽅式
var xhr = new XMLHttpRequest()
xhr.withCredentials = true;
// axios 设置⽅式
axios.defaults.withCredentials = true
条件2. Access-Control-Allow-Credentials为true
条件3. ·Access-Control-Allow-Origin为⾮*`。