Firefox中POST请求因CORS缺失content-type头失败,Chrome正常
看起来你遇到的是Firefox和Chrome对CORS预请求处理差异导致的问题——Firefox对Access-Control-Allow-Headers的校验比Chrome更严格,哪怕你已经在Spring里配置了@CrossOrigin,还是可能因为header大小写匹配或配置生效问题触发错误。
问题根源
你的错误提示明确指出预飞行(OPTIONS)请求返回的Access-Control-Allow-Headers里缺少content-type,虽然你代码里配置了,但可能存在这几个问题:
- Spring的
@CrossOrigin对header大小写敏感,Firefox发送的是首字母大写的Content-Type,而你配置的是小写的content-type,导致匹配失败 - 全局CORS配置覆盖了控制器/方法上的局部配置
- 旧版本Spring的
@CrossOrigin存在allowedHeaders处理bug
具体解决方案
1. 修正@CrossOrigin的header配置
显式包含大小写两种形式的header,确保Firefox的请求能匹配上:
@CrossOrigin(allowedHeaders = {"Content-Type", "content-type", "x-client-id", "X-Client-Id"})
如果你的请求不需要携带凭证(比如cookie),也可以直接用通配符简化配置:
@CrossOrigin(allowedHeaders = "*")
⚠️ 注意:如果请求包含凭证,allowedHeaders不能用*,必须显式列出所有需要的header。
2. 检查全局CORS配置冲突
如果你的Spring项目有全局CORS配置(比如通过WebMvcConfigurer实现),局部的@CrossOrigin可能被覆盖。确保全局配置里也包含Content-Type和x-client-id:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("你的前端域名") .allowedMethods("GET", "POST", "OPTIONS") .allowedHeaders("Content-Type", "x-client-id"); } }
3. 验证预请求响应
打开Firefox开发者工具(F12),切换到网络面板,找到对应的OPTIONS请求,查看响应头里的Access-Control-Allow-Headers是否确实包含你需要的header。如果没有,说明配置没有生效,检查一下@CrossOrigin是否加在了正确的控制器或方法上。
4. 升级Spring版本(如果适用)
如果你用的是Spring Boot 1.x这类旧版本,可能存在@CrossOrigin的allowedHeaders处理bug,升级到Spring Boot 2.x及以上版本大概率能解决问题。
测试验证
修改配置后,重启后端服务,再在Firefox里发起请求,应该就能正常执行了——本质就是让预请求返回的Access-Control-Allow-Headers完全覆盖你请求里携带的所有header,满足Firefox的严格校验要求。
内容的提问来源于stack exchange,提问作者AND

