plainify

一次跨域问题的分析

事件起因 一个需求让我开放一个 HTTP 接口给前端,在联调的过程中,前端请求时出现了一个 CORS 错误,也即跨域问题,错误如下 👇 一开始我的想法是,跨域问题,这我熟啊,在学校写代码的时候就经常遇到,这解决起来不是分分钟的吗。 可更改之后我傻眼了,为什么一直不生效?我陷入了沉思。 在继续描述之前,我们先来了解下到底什么是跨域以及常见的解决方案有哪些。 什么是跨域 所谓跨域,全称是 跨源资源共享 (CORS) Cross- Origin Resource Sharing ,是一种基于 HTTP Header 的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),这样浏览器可以访问加载这些资源。 举个例子:运行在 https://domain-a.com 的 JavaScript 代码使用 XMLHttpRequest 分别发起两个请求 👇 请求A: https://domain-a.com/query 请求B: https://domain-b.com/query 由于发请求的页面站点为 domain-a.com,所以请求 A 属于同源请求,domain-a.com 的后台服务器是允许请求。但是请求 B 的站点域是 domain-b.com,如果要发请求到 domain-b.com,就属于跨源访问,出于安全性考虑,浏览器限制脚本内发起的跨源 HTTP 请求。如下图所示: 因此,为了解决上述问题,跨源域资源共享( CORS )机制就应运而生了。该机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。 CORS 工作机制 跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。 而且对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。...