如何在Spring Boot中从请求头获取user_id并通过响应头返回
Spring Boot通过请求头传递并返回user_id的实现
1. 从请求头获取user_id
在Controller方法参数上用@RequestHeader注解直接读取请求头里的user_id。如果该字段是必填项,可设置required = true;非必填的话可以配置默认值或允许null。
示例代码:
@RestController @RequestMapping("/api") public class UserController { @GetMapping("/process") public ResponseEntity<ProcessResult> handleRequest( @RequestHeader(value = "user_id", required = true) String userId, @RequestParam String businessParam) { // 执行业务逻辑,比如调用Service层处理 ProcessResult result = userBizService.handleUserTask(userId, businessParam); // 把user_id返回给前端,可选择放在响应头或响应体 return ResponseEntity.ok() .header("user_id", userId) // 写入响应头 .body(result); // 也可以在ProcessResult中加入userId字段,通过响应体返回 } }
2. 处理请求头缺失的场景
如果user_id非必填,或者要处理缺失时的逻辑,可以这样配置:
@RequestHeader(value = "user_id", required = false, defaultValue = "anonymous") String userId
或者手动校验并返回错误响应:
if (userId == null) { return ResponseEntity.badRequest().body("请求头缺少必填字段user_id"); }
3. 全局统一处理请求头(可选)
如果多个接口都需要获取user_id,可通过拦截器或AOP统一解析请求头,把userId存入ThreadLocal,避免每个Controller方法都重复写@RequestHeader参数。
示例拦截器实现:
@Component public class UserIdInterceptor implements HandlerInterceptor { public static final ThreadLocal<String> USER_ID_CONTEXT = new ThreadLocal<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader("user_id"); if (userId != null) { USER_ID_CONTEXT.set(userId); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { USER_ID_CONTEXT.remove(); // 清理ThreadLocal,防止内存泄漏 } }
注册拦截器:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private UserIdInterceptor userIdInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userIdInterceptor) .addPathPatterns("/api/**"); // 指定需要拦截的接口路径 } }
之后在业务层直接获取userId:
String currentUserId = UserIdInterceptor.USER_ID_CONTEXT.get();
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

