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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:17