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

Spring @CrossOrigin注解POST方法跨域失效GET正常如何解决?

问题原因

GET属于CORS规范定义的简单请求,浏览器不会提前发送OPTIONS预检请求,直接发送实际请求,只要响应头携带Access-Control-Allow-Origin即可正常返回。而你发送的POST请求Content-Type为application/json,属于非简单请求,浏览器会先发送OPTIONS预检请求确认服务端允许跨域,才会发送实际POST请求。你遇到的问题就是OPTIONS请求未被正确处理,响应没有返回正确的CORS头,因此浏览器抛出跨域错误。


修复方案

方案1:适配Spring Security拦截规则(最常见场景)

如果你的项目集成了Spring Security,默认OPTIONS请求会被身份认证拦截,预检请求不会携带身份凭证,因此直接被拒绝,无法返回CORS头。修改Spring Security配置即可:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            // 开启CORS支持
            .cors(Customizer.withDefaults())
            .authorizeHttpRequests(auth -> auth
                // 放行所有OPTIONS请求
                .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                // 其余请求按你的原有规则配置
                .anyRequest().authenticated()
            )
            // 其他原有配置保持不变,前后端分离项目一般关闭CSRF校验
            .csrf(csrf -> csrf.disable());
        return http.build();
    }
}

方案2:全局统一配置CORS(更稳妥,避免单Controller配置冲突)

新增CORS全局配置类,统一处理所有接口的跨域规则,配置后可以删除Controller上的@CrossOrigin注解避免冲突:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // 允许所有来源,需要带身份凭证时不能用allowedOrigins("*"),改用allowedOriginPatterns
                .allowedOriginPatterns("*")
                // 允许所有请求方法,包含OPTIONS预检
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许所有请求头
                .allowedHeaders("*")
                // 允许前端携带身份凭证(Cookie、Authorization头等)
                .allowCredentials(true)
                // 预检请求缓存1小时,有效期内不用重复发送预检
                .maxAge(3600);
    }
}

方案3:单独调整Controller的CrossOrigin配置

如果不想全局配置,可直接修改AuthController的@CrossOrigin注解,显式指定允许的请求方法:

@CrossOrigin(origins = "*", allowedMethods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}, allowedHeaders = "*")
@RestController
@RequestMapping("/auth")
public class AuthController {
    // 原有代码保持不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:18:04