温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java HTTP跨域怎么解决

发布时间:2026-10-01 11:10:15 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java(后端) 中解决 HTTP 跨域(CORS) 问题,常见且推荐的做法是在后端配置 CORS,而不是靠前端绕过。下面按使用场景给你总结几种主流方案。


一、什么是跨域

当前端页面地址(协议 / 域名 / 端口)与后端接口不一致时,浏览器会发起 CORS 校验,后端必须返回正确的响应头,否则请求会被拦截。


二、Spring Boot 项目(最常用 ✅)

✅ 方式 1:全局 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);
    }
}

✅ 适合:所有接口统一放行


✅ 方式 2:注解方式(局部控制)

@RestController
@CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true")
public class UserController {
}

⚠ 注意:

  • allowCredentials = true 时,origins 不能用 *

✅ 方式 3:过滤器(更底层,兼容非 Spring MVC)

@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 项目(重点 ⚠)

如果你用了 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 拦截


四、原生 Servlet / Java Web

@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()
✅ 生产环境:明确指定前端域名,不要用 *


如果你告诉我:

  • 用的什么框架(Spring Boot / Spring Cloud / 原生 Servlet)
  • 是否使用 Spring Security
  • 前端技术(Vue / React / 小程序)

我可以给你一份可直接复制用的配置。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手