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层注解无法触达的问题,配置步骤如下:
- 在Spring Security配置类中定义跨域配置源,配置规则和你之前
@CrossOrigin使用的规则保持一致 - 在HttpSecurity配置中开启CORS支持,同时显式放行所有OPTIONS预检请求
- 前后端分离跨域场景下按需关闭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
相关产品推荐
相关产品推荐

