5分钟帮后端开发搞清楚跨域问题

一、什么是跨域问题

要说清楚什么是跨域问题必须得先搞清楚,什么叫做浏览器的同源策略,简单来说就是假如两个地址的协议、端口、主机有一个不一样,那么浏览器就会限制这两个地址的资源交互。这样做的好处是处于安全考虑,可以避免CSRF攻击。

二、存在问题

项目开发中经常会遇到一个前端页面会从多个不同的域名请求资源,同源策略会进行限制,导致请求失败,那么如何绕过呢。这里我们不去讨论一些前端的做法,由于本人是后端开发,重点讲下需要后端参与的CORS解决跨域问题。

三、CORS

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)

浏览器将跨域请求分为两种:简单请求和非简单请求。

3.1简单请求

只要同时满足以下两大条件,就属于简单请求。

当浏览器发出的跨域请求为简单请求时,浏览器会自动在头中添加 origin字段,表示此次请求的源,在后端收到请求后,若允许此次跨域请求,则需要在相应头中添加如下字段:

Access-Control-Allow-Origin

此字段的值为请求的源,或者用*代表允许所有跨域请求

Access-Control-Allow-Credentials

此字段可选 true代表允许发送cookie,注意当此字段为true时,Access-Control-Allow-Origin不可为*否则报错。

当浏览器收到带有上述的响应头时便知道此次跨域请求是被允许的。

3.2非简单请求

不满足简单请求的条件便为非简单请求。 非简单请求的特殊之处是会发送一个预检请求,用于在正式通信前确认后端是否允许,预检请求会带上如下字段:

Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,如PUT等

Access-Control-Request-Headers

当请求需要在请求头中发送自定义的头字段时,此字段会携带上自定义的头字段名称

后端接受到预检请求并允许跨域处理时,需要在响应头上加上如下字段:

Access-Control-Allow-Methods

必填,返回所有支持的请求方法

Access-Control-Allow-Headers

当请求头包括Access-Control-Request-Headers时,此字段必填,返回所有支持的请求头信息字段

Access-Control-Allow-Credentials

上面说过了,不再重复

Access-Control-Max-Age

可选字段,指定预检请求的有效期,在此段周期内不需要重复预检。

当预检请求通过后,便与简单请求相似处理即可。

转载于:https://juejin.im/post/5d005cb6f265da1b94214183

猜你喜欢

转载自blog.csdn.net/weixin_33916256/article/details/93179896