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

Angular 4中无法设置HTTP请求头问题求助

解决Angular请求JWT头缺失,Spring Boot后端无法识别的问题

我之前也碰到过一模一样的问题!结合你用Angular旧版Http模块的场景,大概率是这几个原因导致的,咱们一步步来排查解决:

1. 检查请求头的设置方式(针对旧版Http模块)

你用的是@angular/http里的Http类,它的请求头设置和后来的HttpClient不一样,必须用Headers和RequestOptions封装参数,否则头信息可能无法正确携带:

import { Headers, RequestOptions } from '@angular/http';

// 在getStudent方法里调整代码
getStudent(): Observable<any> {
  // 1. 从本地存储获取JWT令牌
  const authToken = localStorage.getItem('authToken');
  if (!authToken) {
    // 可以在这里处理令牌不存在的情况,比如跳转到登录页
    return Observable.throw('Token not found');
  }

  // 2. 创建Headers实例,注意Authorization头的格式是「Bearer + 空格 + 令牌」
  const headers = new Headers({
    'Authorization': `Bearer ${authToken}`,
    'Content-Type': 'application/json'
  });

  // 3. 封装请求选项
  const requestOptions = new RequestOptions({ headers: headers });

  // 4. 发起请求时传入选项
  return this.http.get('/api/student', requestOptions)
    .map((res: Response) => res.json());
}

2. 排查Spring Boot后端的CORS配置

如果后端没有明确允许自定义请求头(比如Authorization),浏览器的OPTIONS预检请求会被拒绝,导致实际请求的头被自动过滤。你需要在Spring Boot里配置CORS:

方式一:全局CORS配置

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:4200") // 替换成你的Angular前端地址
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("Authorization", "Content-Type") // 必须明确允许Authorization头
                .allowCredentials(true);
    }
}

方式二:控制器级别的CORS注解

在你的StudentController类上直接添加注解:

@CrossOrigin(origins = "http://localhost:4200", allowedHeaders = {"Authorization", "Content-Type"})

3. 确认请求头是否真的发送出去

打开浏览器的开发者工具(Chrome按F12),切换到Network标签,找到你的getStudent请求,查看Request Headers部分:

  • 如果看不到Authorization: Bearer xxx这一行,说明前端设置有问题,回到第一步检查代码
  • 如果能看到这一行,说明问题出在后端,继续下一步排查

4. 检查后端JWT拦截器/过滤器

如果后端用了拦截器校验JWT,一定要跳过OPTIONS预检请求——因为OPTIONS请求不会携带Authorization头,直接校验会报错:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
    // 跳过OPTIONS请求,避免预检时的头校验失败
    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
        chain.doFilter(request, response);
        return;
    }

    // 正常的JWT校验逻辑
    String authHeader = request.getHeader("Authorization");
    if (authHeader != null && authHeader.startsWith("Bearer ")) {
        String token = authHeader.substring(7);
        // ... 你的令牌校验逻辑
    }
    chain.doFilter(request, response);
}

按照这个流程一步步排查,基本就能解决请求头缺失的问题啦!

内容的提问来源于stack exchange,提问作者Bao Long Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:10:30