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

Spring Boot无法接收Angular自定义请求头,但Curl可正常接收

问题解决步骤

1. 修复Angular端HttpHeaders的使用错误

Angular的HttpHeaders是不可变对象,调用append()方法不会修改原实例,而是返回一个新的HttpHeaders对象。你的代码里没有接收这个新对象,导致实际发送的请求头是空的。

修改后的代码:

getData(): Observable<any> {
    const url = 'http://localhost:8080/data';
    // 链式调用append,直接生成新的HttpHeaders实例
    const headers_obj = new HttpHeaders()
        .append('Content-Type', 'application/json')
        .append('Batman', 'Forever');
    const httpOptions = {
        headers: headers_obj,
    };
    console.log('Provided user: ', this.username);
    return this.http.get<any>(url, httpOptions);
}

或者分步赋值:

let headers_obj = new HttpHeaders();
headers_obj = headers_obj.append('Content-Type', 'application/json');
headers_obj = headers_obj.append('Batman', 'Forever');

2. 处理后端CORS预检请求

自定义请求头(如Batman)属于非简单请求,浏览器会先发送OPTIONS预检请求确认后端是否允许该头。如果后端没有正确配置CORS,预检请求失败,浏览器不会发送实际的GET请求,自然后端收不到自定义头。

方案一:添加Spring Boot CORS配置类

创建一个全局CORS配置类:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                // 替换为你的Angular应用地址(如http://localhost:4200)
                .allowedOrigins("http://localhost:4200")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 明确允许自定义头,或者用"*"允许所有头
                .allowedHeaders("Content-Type", "Batman")
                .allowCredentials(true);
    }
}

方案二:在自定义Filter中处理OPTIONS请求

修改你的MyFilter,先处理OPTIONS预检请求并设置响应头:

@Configuration
public class MyFilter extends OncePerRequestFilter {
    private final Logger log = LoggerFactory.getLogger(getClass());
    
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 设置CORS响应头
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Batman");
        response.setHeader("Access-Control-Allow-Credentials", "true");

        // 处理OPTIONS预检请求,直接返回200
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }

        String header = request.getHeader("Batman");
        log.info("Batman: "+ header);
        request.getHeaderNames().asIterator().forEachRemaining(s -> log.info(s));
        filterChain.doFilter(request, response);
    }
}

完成以上两步后,Angular发送的自定义请求头就能被后端Filter正常接收了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:33:06