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
相关产品推荐
相关产品推荐

