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

