当前位置:首页 > 技术分析 > 正文内容

CORS(跨来源资源共享)跨域方案

ruisui883周前 (04-07)技术分析10


CORS(跨来源资源共享)是解决跨域请求的核心方案,其实现需结合服务器端配置、前端协作及特定场景的优化策略。以下是主流CORS跨域方案的综合梳理:


一、服务器端配置CORS响应头


这是最核心的解决方案,通过服务器返回特定HTTP头告知浏览器允许跨域访问:


1. 基础头配置


o
Access-Control-Allow-Origin: 指定允许跨域的域名(如http://example.com),或使用*允许所有域名(但不可与凭证类头共存)。


o
Access-Control-Allow-Methods: 定义允许的HTTP方法(如GET, POST, PUT)。


o
Access-Control-Allow-Headers: 声明允许的自定义请求头(如Authorization, Content-Type)。


2. 预检请求处理

对非简单请求(如含自定义头或PUT/DELETE方法),浏览器会先发送OPTIONS预检请求。服务器需响应以下头:


o Access-Control-Max-Age: 预检结果缓存时间(单位秒)。


o 返回204状态码并终止后续处理(针对OPTIONS请求)。


3. 凭证与安全配置


o
Access-Control-Allow-Credentials: true:允许携带Cookie或认证信息。


o Vary: Origin:避免缓存导致不同源请求的响应头冲突。


实现示例:


o Node.js/Express:使用cors中间件一键配置。


o Nginx:通过add_header指令动态设置响应头。


o Spring Boot:注解@CrossOrigin或全局配置类。


二、代理服务器方案


通过代理中转请求,规避浏览器同源策略:


1. 反向代理(如Nginx)

将前端请求代理到同源域名下,后端实际处理跨域:


location /api/ {

proxy_pass http://backend-server;

add_header '
Access-Control-Allow-Origin' '*' always; # 可选二次加固

}


2. 开发环境代理

前端框架(如Vue/React)通过webpack-dev-server或http-proxy-middleware实现本地代理。


三、特定场景的替代方案


1. JSONP(仅限GET请求)

动态创建<script>标签加载数据,需服务端返回回调函数包裹的JSON数据。适用于老旧浏览器,但存在XSS风险。


2. WebSocket

全双工通信协议不受同源策略限制,适用于实时数据传输场景。


四、安全与性能优化建议


1. 避免全开放策略


Access-Control-Allow-Origin: *应谨慎使用,优先限定具体域名。


2. 减少预检请求开销

合理设置Access-Control-Max-Age(如1728000秒=20天),缓存预检结果。


3. 防御CSRF攻击

即使启用CORS,仍需配合Token验证、SameSite Cookie等机制。


五、常见框架配置示例


框架/工具配置方式

Expressapp.use(cors({ origin: 'http://example.com', methods: ['GET','POST']}))

Spring Boot@CrossOrigin(origins = "*")或全局CorsRegistry配置

Nginx动态映射允许的域名,处理OPTIONS请求

Gin(Go)中间件设置响应头


通过合理选择上述方案,可覆盖从简单静态资源到复杂REST API的跨域需求。建议优先采用服务器端CORS配置,结合代理方案优化安全性与性能。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3317.html

标签: 同源策略
分享给朋友:

“CORS(跨来源资源共享)跨域方案” 的相关文章

Linux发行版Debian推出12.2及11.8版本,修复多个安全问题

IT之家 10 月 9 日消息,Debian 是最古老的 GNU / Linux 发行版之一,也是许多其他基于 Linux 的操作系统的基础,包括 Ubuntu、Kali、MX 和树莓派 OS 等,近日 Debian 推出了 12.2 和 11.8 版本,主要修复了多个安全问题。▲ 图源 Debia...

快速上手React

web前端三大主流框架1、Angular大家眼里比较牛的框架,甚至有人说三大框架中只有它能称得上一个完整的框架,因为它包含的东西比较完善,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能。对于刚开始学习使用框架的小伙伴们,可以推荐这个框架,学会之后简直能颠覆之前你对前端开发的认...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

USB电池充电基础:应急指南

USB为便携设备供电与其串行通信功能一样,已经成为一种标准应用。如今,USB 供电已经扩展到电池充电、交流适配器及其它供电形式的应用。应用的普及带来的一个显著效果是便携设备的充电和供电可以互换插头和适配器。因此,相对于过去每种装置都采用专用适配器的架构相比,目前的解决方案允许采用多种电源进行充电。毋...

佳能 EOS R8 深度评测

佳能 EOS R8 的定位是入门级全画幅无反光镜可换镜头相机。尽管在产品阵容中处于这一位置,R8 仍然是一个强大的相机,配备了先进的 R6 II 同款成像传感器、快速处理器和令人难以置信的自动对焦系统,体积小、重量轻、价格低。这款相机是发烧友、旅行者、家庭以及任何想要全画幅传感器相机的人的绝佳选择。...

Alpine.js 如何火起来的!比 React/Vue 如何?

大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!前言前端 JavaScript 框架的创新是这个时代最伟大的技术文化现象之一。Alpine 发音为 /??lpa?n/,中文为阿尔卑斯山、...