You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:34