我们都知道,springMVC开发中,经常会使用到的就是拦截器和过滤器。
两者区别如下:
1.处理器拦截器HandlerInterceptor是Spring MVC提供的特性,依赖于Spring MVC框架,而不依赖Servlet容器;
2.Filter则是Servlet的特性,属于Servlet的规范,并且依赖Servlet容器。
由于我们的框架是基于springboot系列的,所以一般情况下,我们基于HandlerInterceptor来做通用拦截即可。此接口也是我们建立通用请求处理组件的核心。
组件的具体创建步骤如下:
1.定义拦截器
其代码模板如下:
/**
* 通用请求拦截器
*/
public class MyRequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//biz logic
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//biz logic
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//biz logic
}
}
跟aop一样,我们只需要专注自己的业务逻辑即可。
常见业务场景有:校验用户登录态、将业务请求头的信息放入线程本地变量中,便于上下文的存取等。
那么如何定义上下文呢?一般情况下,我们基于ThreadLocal即可。比如:
public static final ThreadLocal<Context> context = new TransmittableThreadLocal<>();
2.注册拦截器
@Configuration
@Order(1)
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyRequestInterceptor());
}
}
可以看到,有了通用处理组件,业务研发接入就会少了很多的配置。