在 Java(后端) 中解决 HTTP 跨域(CORS) 问题,常见且推荐的做法是在后端配置 CORS,而不是靠前端绕过。下面按使用场景给你总结几种主流方案。
当前端页面地址(协议 / 域名 / 端口)与后端接口不一致时,浏览器会发起 CORS 校验,后端必须返回正确的响应头,否则请求会被拦截。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*") // Spring Boot 2.4+
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
✅ 适合:所有接口统一放行
@RestController
@CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true")
public class UserController {
}
⚠ 注意:
allowCredentials = true 时,origins 不能用 *@WebFilter("/*")
public class CorsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
response.setHeader("Access-Control-Allow-Headers", "*");
chain.doFilter(req, res);
}
}
如果你用了 Spring Security,必须在 Security 里放行 CORS:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors().and()
.csrf().disable()
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOriginPatterns(List.of("*"));
config.setAllowedMethods(List.of("*"));
config.setAllowedHeaders(List.of("*"));
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}
❗ 否则:预检请求(OPTIONS)会被 Security 拦截
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) {
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "GET,POST");
resp.setHeader("Access-Control-Allow-Headers", "Content-Type");
}
❌ Allow-Credentials: true + Origin: *(浏览器禁止)
❌ 只处理 GET,不处理 OPTIONS(预检失败)
❌ 前端 fetch 没加 credentials: "include"
❌ Nginx 已处理 CORS,后端又处理(重复 header)
✅ Spring Boot:全局 WebMvcConfigurer
✅ Security:必须配置 cors()
✅ 生产环境:明确指定前端域名,不要用 *
如果你告诉我:
我可以给你一份可直接复制用的配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。