You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular调用Spring REST接口出现CORS跨域问题求助

解决Angular调用Spring REST接口的跨域问题

嘿,我来帮你搞定这个跨域报错!你遇到的是典型的CORS(跨域资源共享)预检请求失败问题,虽然你在客户端加了请求头,但核心问题出在服务端的CORS配置上——客户端的请求头设置没法让服务端允许你的跨域请求,得从Spring这边下手调整。

一、先搞定Spring服务端的CORS配置

这是解决问题的关键,给你几种靠谱的配置方式:

1. 单个接口/控制器加@CrossOrigin注解

如果只是想让/rest/emp/dummy这个接口允许跨域,直接在对应的Controller或者方法上加注解就行:

@RestController
@RequestMapping("/rest/emp")
// 允许Angular的源访问,同时放开所有请求头
@CrossOrigin(origins = "http://localhost:4200", allowedHeaders = "*")
public class EmployeeController {

    @GetMapping("/dummy")
    public Employee getDummyEmployee() {
        // 这里写你的业务逻辑
        return new Employee();
    }
}

这里的origins指定了允许跨域的源(就是你的Angular项目地址),allowedHeaders确保预检请求里的头都能被服务端接受。

2. 全局CORS配置(推荐,适合多接口场景)

如果你的Spring应用有很多接口需要跨域,全局配置更省心,创建一个配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        
        // 允许你的Angular地址跨域
        config.addAllowedOrigin("http://localhost:4200");
        // 放开所有HTTP请求方法(GET、POST、PUT等)
        config.addAllowedMethod("*");
        // 允许所有请求头
        config.addAllowedHeader("*");
        // 如果你的接口需要携带cookie,把这个打开
        config.setAllowCredentials(true);
        
        // 对所有接口路径生效
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

记得把这个配置类放在Spring主启动类的同包或者子包下,确保能被Spring扫描到。

3. 避免配置冲突

如果你用的是Spring Boot 2.x及以上版本,别同时混用注解和全局配置,容易出冲突。另外,检查下你的接口路由是不是正确,先拿Postman直接调用http://127.0.0.1:8080/SpringRestExample/rest/emp/dummy,确保接口本身能正常返回数据,排除接口本身的问题。

二、客户端Angular的请求头注意点

你提到已经加了请求头,这里要提醒你:客户端不需要手动添加Access-Control-Allow-Origin头! 这个是服务端返回的响应头,不是客户端发送的请求头,很多人会在这里搞错。正确的Angular请求代码应该是这样的:

import { HttpClient, HttpHeaders } from '@angular/common/http';

// 组件里的代码
constructor(private http: HttpClient) {}

fetchDummyEmployee() {
  const headers = new HttpHeaders({
    'Content-Type': 'application/json'
    // 如果需要其他自定义头,这里加,但要确保服务端配置里允许这些头
  });
  return this.http.get('http://127.0.0.1:8080/SpringRestExample/rest/emp/dummy', { headers });
}

三、验证配置是否生效

配置完后,打开浏览器开发者工具(F12),切换到Network标签,重新发起请求,找到OPTIONS类型的预检请求,查看它的Response Headers里有没有Access-Control-Allow-Origin: http://localhost:4200。如果有,说明配置生效了;如果没有,再回头检查服务端的配置是否正确。

内容的提问来源于stack exchange,提问作者Abhay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:55:49