跳到正文

CORS

高级网页

CORS(跨源资源共享)是浏览器判断网页能否读取跨源接口响应的一套规则。它让接口服务端决定允许哪些网页来源访问数据;比如后台页面和 API 不同域名时,浏览器会检查 API 返回的跨源许可。

你可能会说:「我的网页和 API 不在同一个域名,接口能返回数据,但浏览器里一直读不到,帮我排查。」

读之前建议先了解(这是一个高级概念)

动手看看

查订单旧站来源管理后台旧站页面浏览器订单接口允许旧站
1

旧站后台要读取订单,浏览器代它向另一个域名的接口发请求,并带上网页的来源。

要点

  1. 1

    先看请求是否跨源

    浏览器比较的是网页与目标地址的协议、主机和端口;其中一项不同,就是跨源。比如你在本机一个端口打开管理后台,却从另一个端口请求 API,开发者工具里就可能看到 CORS 报错。

  2. 2

    许可由接口服务端给出

    网页发起跨源请求后,浏览器会检查接口响应里的 CORS 相关响应头,再决定是否把响应交给网页代码。所以只改前端请求参数,通常不能让一个未获许可的来源读到响应。

  3. 3

    有些请求会先问能不能发

    浏览器对某些跨源请求会先发送预检请求,询问接口是否允许接下来的请求方法和请求头。你给管理后台加了自定义请求头后,如果预检失败,真正的业务请求就不会发出。

  4. 4

    登录状态还要单独考虑

    如果跨源请求需要携带 Cookie,浏览器和服务端还要配合处理凭据设置;此时不能用通配符来表示允许任意来源。CORS 放行只表示浏览器可以读取响应,不代表用户已经登录或有权查看数据。

容易混淆的地方

CORS 容易和身份认证、权限控制混在一起。CORS 管的是浏览器中的网页代码能否读取跨源响应;身份认证确认用户是谁,权限控制判断他能看什么。它也不是接口报错的统称:网络断开、接口返回错误状态或服务端异常,得沿着各自的线索排查。

什么时候用

适合用

  • 你把管理后台部署在一个域名、API 部署在另一个域名,需要让浏览器里的后台页面读取接口数据。
  • 本地开发时,前端与 API 运行在不同端口,浏览器报跨源错误,需要检查接口的 CORS 配置。
  • 网页直接请求第三方 API,先确认对方是否允许你的网页来源读取响应;若不允许,再考虑服务端转发。

不适合用

  • 后端服务直接请求另一个服务的 API 时,通常不靠 CORS 放行;排查重点是网络连通、接口鉴权和服务端响应。
  • 网页和 API 本来就是同源,却拿不到数据时,先查请求地址、登录状态和接口错误,而不是添加 CORS 配置。
  • 想限制某个用户能否查看订单时,CORS 不能代替权限控制;要在后端根据用户身份校验访问权限。

练一练

你做的后台网页从另一个域名请求 API。加上自定义请求头后,开发者工具显示预检失败,业务请求没有发出。下一步怎么处理?

让 AI 帮你做

请帮我排查后台网页请求异源 API 时的 CORS 报错。先核对网页来源、请求方法和请求头,确认是否有预检;再检查 API 的响应头与预检处理。说明需要修改前端还是服务端,并保留现有的身份认证和权限校验。

接下来学什么