You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
13 KiB
287 lines
13 KiB
|
1 month ago
|
# 跨域配置
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文引用的文件**
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [简介](#简介)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构总览](#架构总览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖关系分析](#依赖关系分析)
|
||
|
|
7. [性能考虑](#性能考虑)
|
||
|
|
8. [故障排查指南](#故障排查指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
10. [附录](#附录)
|
||
|
|
|
||
|
|
## 简介
|
||
|
|
本章节面向跨域(CORS)配置模块,系统性说明:
|
||
|
|
- CORS策略配置与生效范围
|
||
|
|
- 允许的域名与方法集合、请求头与响应头定制
|
||
|
|
- 凭证处理(Cookie/Authorization)与安全性权衡
|
||
|
|
- 动态跨域配置与条件性启用
|
||
|
|
- 预检请求(OPTIONS)处理流程
|
||
|
|
- 开发环境与生产环境的差异化配置方案
|
||
|
|
- 常见问题定位与优化建议
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
本项目采用多模块组织,跨域相关能力主要位于基础模块的通用配置中,并在认证模块的安全配置中进行集成。应用启动类负责加载各模块配置,最终由Spring MVC/WebFlux的CORS处理器统一生效。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
A["应用启动<br/>CrmAppApplication"] --> B["基础模块配置<br/>CorsConfig"]
|
||
|
|
A --> C["认证模块安全配置<br/>SecurityConfig"]
|
||
|
|
B --> D["Spring CORS 处理器"]
|
||
|
|
C --> D
|
||
|
|
D --> E["业务控制器<br/>Controller"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
- 全局CORS配置:提供统一的跨域规则,包括允许的来源、方法、请求头、响应头以及是否允许携带凭证等。
|
||
|
|
- 安全配置集成:在认证模块中,将CORS与安全过滤器链结合,确保预检请求不被拦截,且后续鉴权流程正常。
|
||
|
|
- 属性注入与环境区分:通过配置文件或属性类,实现不同环境下的差异化CORS策略。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
|
||
|
|
## 架构总览
|
||
|
|
下图展示了从浏览器发起跨域请求到服务端处理的完整链路,包括预检请求与实际请求的处理差异。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Browser as "浏览器"
|
||
|
|
participant Server as "Spring MVC/Filter"
|
||
|
|
participant Cors as "CORS处理器"
|
||
|
|
participant Security as "安全过滤器链"
|
||
|
|
participant Controller as "业务控制器"
|
||
|
|
Browser->>Server : "发送跨域请求(可能为OPTIONS)"
|
||
|
|
Server->>Cors : "匹配CORS规则"
|
||
|
|
alt "预检请求(OPTIONS)"
|
||
|
|
Cors-->>Browser : "返回Access-Control-*响应头"
|
||
|
|
Server-->>Browser : "204/200 无业务响应体"
|
||
|
|
else "实际请求"
|
||
|
|
Cors-->>Security : "放行并继续过滤链"
|
||
|
|
Security-->>Controller : "鉴权通过后进入业务逻辑"
|
||
|
|
Controller-->>Browser : "业务响应+Access-Control-*响应头"
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### 全局CORS配置(CorsConfig)
|
||
|
|
- 作用:集中定义跨域策略,避免在各控制器重复配置。
|
||
|
|
- 关键能力:
|
||
|
|
- 允许的来源(Origin):支持精确域名或通配符;生产环境建议使用白名单模式。
|
||
|
|
- 允许的方法:GET/POST/PUT/DELETE/OPTIONS等。
|
||
|
|
- 允许的请求头与响应头:如Content-Type、Authorization、自定义X-Header等。
|
||
|
|
- 凭证处理:是否允许携带Cookie或Authorization头,需配合前端设置withCredentials。
|
||
|
|
- 预检缓存:合理设置Access-Control-Max-Age以减少预检次数。
|
||
|
|
- 适用场景:前后端分离、微服务网关前置、静态资源跨域访问。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
|
||
|
|
### 安全配置集成(SecurityConfig)
|
||
|
|
- 作用:将CORS与安全过滤器链整合,保证预检请求不被拦截,同时确保后续鉴权流程有效。
|
||
|
|
- 关键点:
|
||
|
|
- OPTIONS请求放行:避免被JWT过滤器或权限校验阻断。
|
||
|
|
- 与认证模块的属性联动:根据环境变量或配置项切换严格/宽松策略。
|
||
|
|
- 与全局CORS的一致性:避免重复或冲突的规则导致行为不一致。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
### 属性与环境区分(AuthProperties + application.yml)
|
||
|
|
- 作用:通过配置文件或属性类管理CORS相关参数,便于在不同环境切换策略。
|
||
|
|
- 常见配置项:
|
||
|
|
- 允许来源列表(逗号分隔或数组)
|
||
|
|
- 允许方法与请求头
|
||
|
|
- 是否允许凭证
|
||
|
|
- 预检缓存时间
|
||
|
|
- 开关控制(如仅在生产环境启用严格模式)
|
||
|
|
- 建议:
|
||
|
|
- 开发环境:可放宽限制,便于调试。
|
||
|
|
- 生产环境:最小化暴露面,严格白名单,谨慎开启凭证。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
|
||
|
|
### 动态跨域配置与条件性启用
|
||
|
|
- 动态来源解析:基于请求头或上下文动态计算允许来源,适用于多租户或动态子域名场景。
|
||
|
|
- 条件性启用:通过配置开关或环境标识,按需启用/禁用CORS或切换策略。
|
||
|
|
- 最佳实践:
|
||
|
|
- 优先使用白名单而非“*”通配,避免安全风险。
|
||
|
|
- 对敏感接口限制来源与方法,减少攻击面。
|
||
|
|
- 对预检缓存时间进行调优,平衡性能与灵活性。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
|
||
|
|
### 预检请求处理与响应头定制
|
||
|
|
- 预检流程:浏览器先发送OPTIONS请求,服务端返回Access-Control-Allow-*头,确认允许后再发实际请求。
|
||
|
|
- 关键响应头:
|
||
|
|
- Access-Control-Allow-Origin:允许的来源
|
||
|
|
- Access-Control-Allow-Methods:允许的方法
|
||
|
|
- Access-Control-Allow-Headers:允许的请求头
|
||
|
|
- Access-Control-Expose-Headers:允许前端读取的响应头
|
||
|
|
- Access-Control-Allow-Credentials:是否允许凭证
|
||
|
|
- Access-Control-Max-Age:预检缓存时长
|
||
|
|
- 定制建议:
|
||
|
|
- 明确暴露必要响应头,避免前端读取受限。
|
||
|
|
- 合理设置Max-Age,降低频繁预检带来的延迟。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
### 凭证处理与安全性
|
||
|
|
- 何时需要凭证:当后端需要读取Cookie或前端需要携带Authorization时。
|
||
|
|
- 风险点:
|
||
|
|
- 开启Allow-Credentials后,不能设置Allow-Origin为“*”。
|
||
|
|
- 必须严格限定Allow-Origin为可信来源。
|
||
|
|
- 前端配合:
|
||
|
|
- 设置withCredentials=true(XHR/fetch)。
|
||
|
|
- 确保后端正确返回Access-Control-Allow-Credentials。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
|
||
|
|
### 开发环境与生产环境的差异化配置
|
||
|
|
- 开发环境:
|
||
|
|
- 可放宽来源与方法,便于联调。
|
||
|
|
- 可关闭严格校验,快速定位问题。
|
||
|
|
- 生产环境:
|
||
|
|
- 严格白名单来源,限制方法与请求头。
|
||
|
|
- 谨慎开启凭证,必要时引入网关层二次校验。
|
||
|
|
- 调整预检缓存时间,提升性能。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
|
||
|
|
## 依赖关系分析
|
||
|
|
CORS配置与安全配置之间存在协作关系:全局CORS负责跨域规则,安全配置确保预检请求不被拦截并与鉴权流程协同。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
classDiagram
|
||
|
|
class CrmAppApplication {
|
||
|
|
+启动应用
|
||
|
|
}
|
||
|
|
class CorsConfig {
|
||
|
|
+配置允许来源
|
||
|
|
+配置允许方法
|
||
|
|
+配置请求头/响应头
|
||
|
|
+配置凭证
|
||
|
|
+配置预检缓存
|
||
|
|
}
|
||
|
|
class SecurityConfig {
|
||
|
|
+配置安全过滤器链
|
||
|
|
+放行OPTIONS
|
||
|
|
+与CORS协同
|
||
|
|
}
|
||
|
|
class AuthProperties {
|
||
|
|
+读取配置项
|
||
|
|
+环境区分
|
||
|
|
}
|
||
|
|
CrmAppApplication --> CorsConfig : "加载"
|
||
|
|
CrmAppApplication --> SecurityConfig : "加载"
|
||
|
|
SecurityConfig --> CorsConfig : "协同"
|
||
|
|
SecurityConfig --> AuthProperties : "读取配置"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
|
||
|
|
## 性能考虑
|
||
|
|
- 预检缓存:合理设置Access-Control-Max-Age,减少浏览器重复预检。
|
||
|
|
- 最小化暴露:仅暴露必要的响应头,避免不必要的信息泄露。
|
||
|
|
- 来源白名单:避免使用“*”通配,减少无效匹配开销。
|
||
|
|
- 网关层优化:在网关层统一处理CORS,减轻应用服务器压力。
|
||
|
|
- 监控与度量:记录跨域失败率与预检频率,辅助容量规划。
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 故障排查指南
|
||
|
|
- 现象:浏览器控制台报“跨域错误”或“预检失败”
|
||
|
|
- 检查Access-Control-Allow-Origin是否正确返回且与请求来源一致。
|
||
|
|
- 若启用了凭证,确认未使用“*”作为来源。
|
||
|
|
- 现象:预检请求被拦截
|
||
|
|
- 检查安全过滤器链是否放行OPTIONS请求。
|
||
|
|
- 确认CORS配置已覆盖对应路径。
|
||
|
|
- 现象:前端无法读取响应头
|
||
|
|
- 检查Access-Control-Expose-Headers是否包含所需响应头。
|
||
|
|
- 现象:生产环境突然不可用
|
||
|
|
- 核对环境配置是否误用开发宽松策略。
|
||
|
|
- 检查来源白名单是否遗漏新域名或子域名。
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
- 通过全局CORS配置与安全配置的协同,可实现灵活且安全的跨域策略。
|
||
|
|
- 开发环境应注重效率,生产环境应强调安全与性能。
|
||
|
|
- 预检缓存与最小化暴露是提升性能的关键。
|
||
|
|
- 建议在网关层统一治理CORS,增强可维护性与一致性。
|
||
|
|
|
||
|
|
[本节为总结性内容,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 附录
|
||
|
|
- 常用响应头说明:
|
||
|
|
- Access-Control-Allow-Origin:允许的来源
|
||
|
|
- Access-Control-Allow-Methods:允许的方法
|
||
|
|
- Access-Control-Allow-Headers:允许的请求头
|
||
|
|
- Access-Control-Expose-Headers:允许前端读取的响应头
|
||
|
|
- Access-Control-Allow-Credentials:是否允许凭证
|
||
|
|
- Access-Control-Max-Age:预检缓存时长
|
||
|
|
- 最佳实践清单:
|
||
|
|
- 使用白名单而非“*”
|
||
|
|
- 谨慎开启凭证
|
||
|
|
- 明确暴露必要响应头
|
||
|
|
- 合理设置预检缓存
|
||
|
|
- 在网关层统一处理CORS
|
||
|
|
|
||
|
|
[本节为通用参考,不直接分析具体文件]
|