定义拦截器
首先定义一个拦截器,重写请求处理前和处理后会被执行的方法
public class UserHeaderIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserHeader userHeader = UserHeader.builder()
.userId(request.getHeader("userId"))
.version(request.getHeader("version"))
.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);
}
}
注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public UserHeaderIntercepter userHeaderIntercepter() {
return new UserHeaderIntercepter();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userHeaderIntercepter());
WebMvcConfigurer.super.addInterceptors(registry);
}
}
被@Configuration注解修饰的类为配置类,在springboot项目启动的时候会被自动加载
但是只有配置类存在于当前moduel才会被加载
因为我们的拦截器定义为一个公共的moduel,其他moduel想要使用必须通过其他方式才能加载成功
加载配置类
想要加载成功,需要在resource文件下创建如下文件:
这样在其他moduel启动的时候就会自动加载这个文件
EnableAutoConfiguration翻译过来就是自动配置的意思
这其实是springboot实现自动化配置的核心技术
观察springboot各种starter也是根据这种方式实现了
springboot之所以不需要开发者像springmvc一样配置很多额外的信息,就是因为springboot在各种@Configuration修饰的类中完成了这些配置