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
相关产品推荐
相关产品推荐

