首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >有关CORS跨域请求,这事没完

有关CORS跨域请求,这事没完

作者头像
有态度的马甲
发布2025-11-24 14:21:35
发布2025-11-24 14:21:35
10
举报
文章被收录于专栏:精益码农精益码农

之前写了有关跨域访问的几篇文章:

  • 全网最全的跨域资源共享CORS方案分析[1]
  • CORS预检Options请求的思考[2]

回顾重点: Origin=schema+ Host+ Port,

1. CORS

不同源的浏览器脚本(javascript、ActionScript、canvas)在没明确授权的情况下,不能读写对方的资源。

CORS是W3C推出的跨域请求方案: 让web服务器明确授权非同源页面脚本来访问自己, 以Response特定响应头Access-Control-- 体现; 目前现代浏览器均认可并支持这些标头。

2. CORS 非简单请求触发的预检请求

浏览器跨域访问时, 会自动带上Origin请求头。

当出现非简单请求, 浏览器会自动产生预检Options请求,使用Access-Control-Request-Method、Access-Control-Request-Headers和Origin请求头, 先去web服务器确认跨域访问时允许的方法和自定义请求头。

如果预检Options请求未能通过,后续的实际请求将不会发起


这里提示一个重要的编程实践:

1> 脚本默认不携带凭据 2> 脚本可通过WithCredentials= true 配置要求浏览器携带凭据。

有一个例外预检Options始终不会携带凭据[3],但在常见的web编程实践中(凭据认证会在处理管道的前面),如果预检Options返回非200, 后续的实际请求就不会发起, 所以请考虑对预检Options请求忽略凭据访问。

kong网关的CORS的插件,配置Preflight Continue可以帮助规避这个编程实践问题。

默认preflight_continue = false, 意味着插件不将预检请求转发给upstream,所以此处保持默认就好, 网关会根据请求特征和CORS配置产生CORS响应头,并返回你期待的200 OK响应码

代码语言:javascript
复制

function CorsHandler:access(conf)
  local req_origin = kong.request.get_header("Origin")
  if kong.request.get_method() ~= "OPTIONS"
     or not is_origin_provided(req_origin)
     or not kong.request.get_header("Access-Control-Request-Method")
  then
    return
  end

  -- don't add any response header because we are delegating the preflight to
  -- the upstream API (conf.preflight_continue=true), or because we already
  -- added them all
  
  kong.ctx.plugin.skip_response_headers = true

  if conf.preflight_continue then
    return
  end

//......
 return kong.response.exit(HTTP_OK)
end

源码在https://github.com/Kong/kong/blob/255d4a1fad88082c13a875fdf1a70ceb4e4ea457/kong/plugins/cors/handler.lua#L210

如果你手痒设置成true,那么预检请求就会转发到upstream,需要后端自己去忽略对预检Options请求的凭据认证。

参考资料

[1]

全网最全的跨域资源共享CORS方案分析: https://www.cnblogs.com/JulianHuang/p/10337980.html

[2]

CORS预检Options请求的思考: https://www.cnblogs.com/JulianHuang/p/14225515.html

[3]

预检Options始终不会携带凭据: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Credentials

图片
图片

协程池是调用端并发请求的缓释胶囊

Golang倒腾一款简配的具有请求排队功能的并发受限服务器

一次sql请求,返回分页数据和总条数

Go动态感知资源变更的常规套路,你指定用过!

两将军问题和TCP三次握手

老八股谈事务处理,到底在谈什么?

本文和配图均为原创,搁笔常恐意味尽,愿闻读者金玉声。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. CORS
  • 2. CORS 非简单请求触发的预检请求
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档