# 跨域配置 **本文引用的文件** - [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) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本章节面向跨域(CORS)配置模块,系统性说明: - CORS策略配置与生效范围 - 允许的域名与方法集合、请求头与响应头定制 - 凭证处理(Cookie/Authorization)与安全性权衡 - 动态跨域配置与条件性启用 - 预检请求(OPTIONS)处理流程 - 开发环境与生产环境的差异化配置方案 - 常见问题定位与优化建议 ## 项目结构 本项目采用多模块组织,跨域相关能力主要位于基础模块的通用配置中,并在认证模块的安全配置中进行集成。应用启动类负责加载各模块配置,最终由Spring MVC/WebFlux的CORS处理器统一生效。 ```mermaid graph TB A["应用启动
CrmAppApplication"] --> B["基础模块配置
CorsConfig"] A --> C["认证模块安全配置
SecurityConfig"] B --> D["Spring CORS 处理器"] C --> D D --> E["业务控制器
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 [本节为通用参考,不直接分析具体文件]