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

Spring Boot Security中POST请求@CrossOrigin跨域失效问题

问题产生原因
  • @CrossOrigin是Spring MVC层面的注解,只有当请求顺利通过Spring Security过滤器链、到达Spring MVC的DispatcherServlet后,该注解才会生效,为响应注入跨域允许头。
  • 你配置的GET接口可以正常跨域,是因为携带普通请求参数的GET请求属于CORS简单请求,浏览器不会提前发送OPTIONS预检请求,请求可以直接抵达MVC层被@CrossOrigin处理。
  • 接收JSON格式请求体的POST接口属于CORS复杂请求:浏览器会在正式发送POST请求前,先发送一个OPTIONS方法的预检请求,校验服务端是否允许当前源的跨域访问、是否支持对应的请求方法与请求头。Spring Security默认会对所有未配置放行规则的请求做权限校验,OPTIONS预检请求本身不会携带认证凭证,会被Security过滤器直接拦截拒绝,根本无法到达MVC层触发@CrossOrigin的逻辑,最终触发跨域访问失败。引入Spring Security依赖前不存在这层前置过滤器拦截,因此POST接口跨域可以正常工作。
修复配置方案

推荐在Spring Security层面统一配置CORS处理逻辑,从过滤器链前置环节解决跨域问题,避免MVC层注解无法触达的问题,配置步骤如下:

  1. 在Spring Security配置类中定义跨域配置源,配置规则和你之前@CrossOrigin使用的规则保持一致
  2. 在HttpSecurity配置中开启CORS支持,同时显式放行所有OPTIONS预检请求
  3. 前后端分离跨域场景下按需关闭CSRF防护(默认开启的CSRF会拦截无有效CSRF令牌的POST请求,同样会表现为跨域失败)

参考配置代码:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    // 跨域配置,和原有@CrossOrigin的允许源保持一致
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(List.of(crossorg)); // 替换为实际允许的前端域名
        config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowedHeaders(List.of("*"));
        config.setAllowCredentials(true); // 前端需要携带Cookie、Authorization认证头时开启
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 开启Security层CORS处理,会自动加载上面定义的跨域配置
            .cors().and()
            // 前后端分离场景关闭CSRF防护
            .csrf().disable()
            .authorizeRequests()
                // 显式放行所有OPTIONS预检请求
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                // 登录接口本身需要放行,否则未认证状态下无法访问
                .antMatchers("/login").permitAll()
                // 其余接口的权限规则按实际业务配置
                .anyRequest().authenticated();
    }
}

配置完成后,原有控制器上的@CrossOrigin注解可以保留,不会和全局配置冲突;Security层的CORS过滤器会优先处理OPTIONS预检请求,正式请求到达MVC层后原有注解逻辑依然可以正常生效。

如果不想做全局CORS配置,最低限度也需要在Security的权限规则中放行所有OPTIONS请求,让预检请求可以顺利到达MVC层被@CrossOrigin处理,但这种方式容易出现配置遗漏,不推荐使用。


内容的提问来源于stack exchange,提问作者NorwegianDeveloper005

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:27:14