CORS跨域请求测试 - 检查响应头
向目标URL发送简单请求,分析Access-Control相关响应头,诊断跨域问题。
UD5工具箱
深入理解跨域资源共享(CORS)机制,通过真实请求演示成功与失败的跨域场景,掌握常见错误及解决方案。
点击下方场景发起真实跨域请求,观察结果差异:
输入任意URL,测试其CORS配置:
| 响应头 | 作用 | 示例值 |
|---|---|---|
Access-Control-Allow-Origin |
指定允许跨域访问的源(origin) | * 或 https://example.com |
Access-Control-Allow-Methods |
允许的HTTP方法(预检响应中使用) | GET, POST, PUT, DELETE |
Access-Control-Allow-Headers |
允许的请求头(预检响应中使用) | Content-Type, Authorization |
Access-Control-Max-Age |
预检请求缓存时间(秒) | 86400(24小时) |
Access-Control-Allow-Credentials |
是否允许携带Cookie等凭证 | true |
Access-Control-Expose-Headers |
允许客户端读取的响应头 | X-Custom-Header, X-Rate-Limit |
满足以下全部条件时,浏览器直接发送请求,无需预检:
text/plain、multipart/form-data 或 application/x-www-form-urlencoded不满足简单请求条件时,浏览器先发送 OPTIONS 预检请求:
application/json响应未包含 Access-Control-Allow-Origin 头。需要在服务端添加该响应头。
OPTIONS 请求返回非 2xx 状态码,或缺少必要响应头。检查服务端是否正确处理 OPTIONS 请求。
携带 Cookie 时,Allow-Origin 不能为 *,必须指定具体源,且需设置 Allow-Credentials: true。
自定义请求头未被 Access-Control-Allow-Headers 包含,需在服务端添加相应配置。
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种浏览器安全机制。浏览器遵循同源策略(Same-Origin Policy),默认禁止网页向不同源(协议、域名、端口任一不同)的服务器发送请求并读取响应。
这是为了防止恶意网站窃取用户在其他网站的数据(如银行信息、邮件等)。CORS 通过特定的 HTTP 响应头,让服务器明确声明允许哪些外部源访问其资源,从而在安全与灵活性之间取得平衡。
关键理解:CORS 限制的是浏览器读取响应,而非请求本身。后端服务器之间的通信不受 CORS 限制。
CORS 错误发生在浏览器端——浏览器检测到跨域响应的响应头不满足要求,于是拦截响应并抛出错误。排查步骤:
Access-Control-Allow-Origin 头。常见错误信息:"Access to fetch at '...' from origin '...' has been blocked by CORS policy"
通用原则:在响应中添加 Access-Control-Allow-Origin 等相关头即可。以下是常见框架的配置方式:
cors 中间件,app.use(cors({ origin: 'https://example.com' }))flask-cors 扩展,CORS(app, origins=['https://example.com'])@CrossOrigin 注解或全局配置 WebMvcConfigureradd_header Access-Control-Allow-Origin *;django-cors-headers 包生产环境建议明确指定允许的源,而非使用通配符 *。
JSONP(JSON with Padding)是 CORS 出现之前的跨域解决方案。它利用 <script> 标签不受同源策略限制的特性,通过动态创建 script 标签来获取数据。
| 对比维度 | CORS | JSONP |
|---|---|---|
| 支持方法 | 所有HTTP方法 | 仅 GET |
| 安全性 | 较高,精细控制 | 较低,易受XSS攻击 |
| 错误处理 | 完善 | 难以处理错误 |
| 推荐程度 | ✅ 现代标准 | ❌ 已过时,不推荐 |
除非需要兼容非常老旧的浏览器,否则应使用 CORS。
这是一个非常常见的困惑。Postman、curl 等工具不受 CORS 限制,因为它们不是浏览器环境。
CORS 是浏览器内置的安全策略,由浏览器强制执行。Postman 是原生应用程序,它直接发送 HTTP 请求并接收响应,不会检查 Access-Control-Allow-Origin 头。
同理,后端服务之间的相互调用也不受 CORS 限制。CORS 只影响浏览器中的 JavaScript 发起的跨域请求。
使用通配符 * 意味着允许任意网站跨域访问该资源。潜在风险包括:
Allow-Origin 为 * 时,浏览器不允许携带 Cookie(credentials: 'include' 会报错)。对于公开的、不涉及用户隐私的 API(如公共数据集),使用 * 是可接受的。对于涉及用户数据的 API,必须指定具体的允许源。
简单请求必须同时满足以下条件:
application/x-www-form-urlencoded、multipart/form-data 或 text/plain只要不满足以上任一条件,浏览器就会先发送 OPTIONS 预检请求,向服务器确认是否允许该跨域请求。
常见的触发预检场景:使用 Content-Type: application/json、携带 Authorization 头、使用 PUT/DELETE 方法。
开发阶段的几种快速方案:
chrome --disable-web-security --user-data-dir=/tmp(仅限本地测试,非常危险)。⚠️ 警告:切勿在生产环境使用上述不安全的做法!
向目标URL发送简单请求,分析Access-Control相关响应头,诊断跨域问题。
运行包含缺陷的正则表达式,展示如何导致浏览器假死,并学习如何避免。
可混入指定关键词的Lorem Ipsum生成器,支持段落、列表与HTML标记,更真实模拟内容。
生成一键注入的JS书签,将任意网页的背景强制变黑、文字变白或变黄。
输入`*/5 * * * 1`这样的Cron表达式,翻译成“每周一每隔5分钟”的人类语言。
将箱子推到目标点,经典的Sokoban游戏,内置多关卡。
浏览不同高度云族(卷云、积云、层云等)的图片、简图和预报天气含义。
输入盘子数量,动画展示汉诺塔的递归移动步骤,帮助理解递归思想。
屏幕快速闪出字母,要求看到特定字母时立即按键,评估持续注意力和冲动控制。
输入共享密钥,实时生成30秒TOTP,验证与特定平台二次验证的一致性。
输入复杂对象,使用 structuredClone 进行深拷贝,并对比原始对象与克隆体,展示可拷贝类型。
构建嵌套元素,触发事件并逐步显示事件流经路径,可切换捕获/冒泡模式。
结构化周回顾模板:记录本周成就、失败、学到的及下周重点。
生成深邃宇宙风格的粒子背景代码,粒子间近距离自动连线,适合科技感网页。
点击刷新获取一则双语冷笑话或脑筋急转弯,复制分享,为日常增添乐趣。
在Canvas上控制一条不断增长的蠕虫吃光点,撞墙或撞到自己则结束。
使用Canvas绘制的经典吃豆人游戏,包含鬼魂AI与经典音效,致敬怀旧街机。
将公主、魔法等经典元素随机组合成一个新童话梗概。
从内置库选择喜欢的名言,拖拽到屏幕任意位置缩放摆放,截图当壁纸。
显示一句英文,判断它属于明喻(as/like)还是暗喻,提升文学赏析能力。
动画展示埃拉托斯特尼筛法逐步划去倍数,最终留下指定范围内的所有素数。
结合对比度拉伸和强噪点纹理,将照片变为具有深色粗糙质感的炭笔素描画。
早晨呈现行动导向三问,晚间的复盘三问,引导结构化记录,迭代自我认知。
生成拥有奇怪生理特征、大气需求和摄食方式的外星生物文字档案。
每天显示一条马可·奥勒留、塞涅卡等斯多葛派哲学家的经典语录。
创建自定义 DataTransfer 对象,设置数据和拖拽效果,可用于测试拖放事件处理。
每天记录三件感恩小事,配Emoji表情,回顾时展示月度积极词云,提升幸福感。
每天记录值得感恩的三件事,日期存储,可回顾过往记录,培养积极心态。
调整标准方程参数,动态绘制对应的圆锥曲线图形。
生成从0滚到目标数字的动画,可调节速度和延迟,复制HTML/JS代码。