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

Angular5向Spring Boot发送PUT请求时遇401未授权问题求助

解决Angular PUT请求401未授权问题(仅传ID更新属性)

看起来你遇到的核心问题是Angular端PUT请求的headers参数位置错误,导致Spring Boot的授权拦截器没拿到正确的Authorization Token,触发了401/AccessDenied异常。咱们一步步来解决:

1. 修正Angular端的PUT请求写法

你的intervention.service.ts里的updateIntervention方法,把headers放在了http.put的第二个参数位置——但HttpClient的put方法签名是:

put(url: string, body: any | null, options?: { headers?: HttpHeaders; ... }): Observable<any>

第二个参数是请求体(body),第三个才是包含headers的配置项。你现在把headers当成body传了,导致请求头里根本没有Authorization字段,Spring自然判定未授权。

修改后的代码:

updateIntervention(id: number) {
  if (this.authService.getToken() == null) {
    this.authService.loadToken();
  }
  // 第二个参数传null(因为不需要请求体),第三个参数放headers配置
  const headers = new HttpHeaders({'Authorization': this.authService.getToken()});
  return this.http.put(`${this.host}/updateIntervention/${id}`, null, { headers });
}

2. 验证Spring Boot端的授权配置

既然带@RequestBody时请求正常,说明你的授权拦截器是能识别请求头里的Token的。现在确认下:

  • 你的Spring授权拦截器是否对PUT /updateIntervention/{id}这个路径开放了权限(或者说是否要求Token验证,而你现在的请求终于能带上Token了)
  • 确保interventionRepo.getOne(id)不会因为ID不存在抛出异常(不过这是后续业务问题,先解决授权)

3. 额外优化建议

  • 可以把Token的获取和Header的封装抽成公共方法,避免重复代码
  • 建议在Spring接口里加上@ResponseBody(或者直接用@RestController,这样就不用每个方法加@ResponseBody了),确保返回的是JSON格式
  • 可以给Spring接口添加日志,打印请求头里的Authorization字段,方便排查:
@RequestMapping(value="/updateIntervention/{id}",method = RequestMethod.PUT)
public @ResponseBody Intervention update(@PathVariable Long id, HttpServletRequest request){
    System.out.println("Authorization Header: " + request.getHeader("Authorization"));
    System.out.println("in intevention update");
    Intervention I = interventionRepo.getOne(id);
    I.setValid(true);
    interventionRepo.save(I);
    return I;
}

这样修改后,Angular请求会正确带上Authorization Token,Spring就能正常识别授权,执行更新逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:08