# 跨域
前后端分离大多数都难以避免跨域问题。
# CORS
cors
全称为 Cross Origin Resource Sharing(跨域资源共享)。
这种方案对于前端来说没有什么工作量,和正常发送请求写法上没有任何区别,工作量基本都在后端这里。每一次请求,浏览器会先以 OPTIONS
请求方式发送一个预请求(不是所有请求都会发送 options),通过预检请求从而获知服务器端对跨源请求支持的 HTTP
方法。在确认服务器允许该跨源请求的情况下,再以实际的 HTTP
请求方法发送那个真正的请求。
只要第一次配好了,之后不管有多少接口和项目复用就可以了,一劳永逸的解决了跨域问题,而且不管是开发环境还是正式环境都能方便的使用。详细 MDN 文档 (opens new window)
# 代理
在 dev
开发模式下可以下使用 webpack 的 proxy
使用也是很方便,参照 文档 (opens new window) 就会使用了。但这种方法在生产环境是不能使用的。
在生产环境中需要使用 nginx
进行反向代理。不管是 proxy
和 nginx
的原理都是一样的,通过搭建一个中转服务器来转发请求规避跨域的问题。
注意:
但是这种方法会有一个很大的缺陷,那就是,如果前后端分离用的是 token
头验证登录状态(或其他状态),此方法不存在问题;但是,如果用的是服务器 SESSION
验证登录状态(或其他状态),此方法无效。
# 图表说明
CORS | 代理 | |
开发环境 | cors | proxy |
生产环境 | cors | nginx |
CORS | 代理 | |||
开发环境 | 生产环境 | 开发环境 | 生产环境 | |
Token | √ | √ | √ | √ |
SESSION | √ | √ | × | × |