基于Tomcat与Apache2的Spring Boot应用CORS OPTIONS请求配置问题
解决Tomcat+Apache2环境下Spring Boot应用的CORS配置问题
嘿,我看你已经在Spring Boot控制器上加了@CrossOrigin注解,本地运行时的OPTIONS请求响应头也显示CORS配置生效了——估计你是部署到Tomcat+Apache2环境后遇到跨域失效的问题了吧?这在反向代理场景里挺常见的,下面给你几个针对性的解决办法:
1. 换成全局CORS过滤器(比单个控制器注解更可靠)
单个控制器的@CrossOrigin在复杂代理环境下可能覆盖性不够,建议配置全局过滤器,让所有API请求都能应用CORS规则:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 替换成你的前端域名,和你本地配置的一致 config.addAllowedOrigin("http://www.test.be"); // 允许携带Cookie等凭证 config.setAllowCredentials(true); // 允许所有请求方法,也可以按需指定比如GET,POST config.addAllowedMethod("*"); // 允许所有请求头 config.addAllowedHeader("*"); // 预检请求的缓存时间,减少OPTIONS请求次数 config.setMaxAge(1800L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 对所有/api开头的路径生效 source.registerCorsConfiguration("/api/**", config); return new CorsFilter(source); } }
2. 调整Apache2的反向代理配置
Apache2作为反向代理时,可能会拦截或修改CORS响应头,甚至直接吃掉OPTIONS预检请求。你需要在虚拟主机配置文件(比如/etc/apache2/sites-available/your-site.conf)里添加这些配置:
# 配置CORS响应头,和Spring Boot的规则保持一致 Header always set Access-Control-Allow-Origin "http://www.test.be" Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header always set Access-Control-Allow-Headers "Content-Type, Authorization" Header always set Access-Control-Allow-Credentials "true" # 直接处理OPTIONS预检请求,返回200,避免转发到Tomcat时出问题 RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
要是发现浏览器报“重复的Access-Control-Allow-Origin”错误,就把Header always set改成Header merge,这样Apache2会合并相同的响应头,不会重复设置。
3. 检查Tomcat的全局CORS配置(避免冲突)
如果Tomcat本身配置了全局CORS过滤器,可能会和Spring Boot的配置冲突。你可以打开Tomcat的conf/web.xml文件,看看有没有类似下面的配置:
<filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <!-- 各种CORS参数 --> </filter>
如果有的话,要么删掉它(推荐用Spring Boot的配置更灵活),要么把参数改成和你的需求一致,避免规则冲突。
4. 部署后排查小技巧
部署完后,用浏览器开发者工具的Network标签,查看实际的OPTIONS请求:
- 确认
Access-Control-Allow-Origin和你的前端域名完全匹配(浏览器对这个很严格,不能带斜杠或者多余字符) - 检查有没有重复的CORS响应头,这会直接导致跨域失败
- 看看OPTIONS请求是不是真的转发到了Tomcat,有没有被Apache2拦截
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

