Spring Boot Security下CORS问题:如何完全禁用CORS?
如何在Spring Boot + Spring Security中完全禁用CORS支持
嘿,我来帮你搞定完全禁用CORS的问题!你提到用自定义OncePerRequestFilter的思路是对的,但要注意Spring Security的过滤器链优先级更高,得搭配Security配置一起调整才能彻底生效。
第一步:自定义CORS禁用过滤器
这个过滤器会在每个请求进来时清除所有CORS相关响应头,跳过任何CORS预处理逻辑:
@Component public class DisableCorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 清除所有CORS相关的响应头 response.setHeader("Access-Control-Allow-Origin", null); response.setHeader("Access-Control-Allow-Methods", null); response.setHeader("Access-Control-Allow-Headers", null); response.setHeader("Access-Control-Allow-Credentials", null); response.setHeader("Access-Control-Max-Age", null); // 直接传递请求,不做任何CORS相关处理 filterChain.doFilter(request, response); } }
第二步:在Spring Security配置中禁用CORS
因为Spring Security本身会自带CORS处理逻辑,所以必须在Security配置里明确禁用它,否则你的自定义过滤器可能被Security的CORS处理覆盖:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 禁用Spring Security内置的CORS处理 .cors(cors -> cors.disable()) // 这里加上你的其他Security配置,比如授权规则、CSRF设置等 .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) // 其他配置(比如表单登录、JWT认证等) // .formLogin(form -> form.loginPage("/login")) // ... return http.build(); } }
额外注意事项
- 确保你的自定义过滤器被Spring容器扫描到(比如放在
@SpringBootApplication注解所在包的子包下,或者手动通过@Bean注册) - 如果之前项目里用过
@CrossOrigin注解,记得把这些注解全部移除,避免和禁用逻辑冲突 - 测试时可以打开浏览器开发者工具的Network标签,检查响应头里是否还有CORS相关字段,确保已经被完全清除
内容的提问来源于stack exchange,提问作者Sergey Vladimirovich
相关产品推荐
相关产品推荐

