HandlerInterceptor截获取请求头数据
@Component
public class LoginHandler implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserHeader userHeader = UserHeader.builder()
.userId(request.getHeader("authorization"))
.build();
//放到线程里 封装到一个类中
UserHeaderHodler.threadLocal.set(userHeader);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHeaderHodler.threadLocal.remove();
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
public class UserHeaderHodler {
public static ThreadLocal<UserHeader> threadLocal = new ThreadLocal<>();
/**
* 需要兼容userHeader为null的情况
*
* @return
*/
public static String getUserId() {
return Optional.ofNullable(threadLocal.get())
.map(userHeader -> userHeader.getUserId())
.orElse("");
}
}
@Data
@Builder
public class UserHeader {
private String userId;
}
注册一个全局拦截器
拦截所有请求
@Configuration
public class HandlerHeaderConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserHeaderIntercepter()).addPathPatterns("/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
使用举例
//线程池中获取拦截的请求头数据
UserHeader userHeader = UserHeaderHodler.threadLocal.get();
String userId = userHeader.getUserId();