目录
结论:Spring拦截器在请求进入Controller进行拦截添加自己的处理逻辑,Mybatis拦截器在Mapper层的方法上进行拦截添加自己的处理逻辑。
一、Spring的拦截器
Spring的拦截器主要分两种:HandlerInterceptor、MethodInterceptor。
1.1、HandlerInterceptor接口
HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行。实现一个HandlerInterceptor拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类(Sping 5中已弃用,不建议使用)。
HandlerInterceptor源码如下:
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
preHandle方法:在请求进入到Controller进行拦截,有返回值。(返回true则将请求放行进入Controller控制层,false则请求结束返回错误信息)
用法:在请求进入Controller之前,我们拦截下来进行自己的判断逻辑,比如:校验权限、token等内容后确定是否放行请求进入Controller。
postHandle方法:在请求进入Controller控制器执行完成,但是还没有返回模板进行渲染拦截。没有返回值。就是Controller----->拦截------>ModelAndView。
用法:因此我们可以将Controller层返回来的参数进行一些修改,它就包含在ModelAndView中,所以该方法多了一个ModelAndView参数。
afterCompletion方法:在ModelAndView返回给前端渲染后执行。
用法:例如登录的时候,我们经常把用户信息放到ThreadLocal中,为了防止内存泄漏,就需要将其remove掉,该操作就是在这里执行的。
1.2、MethodInterceptor接口
MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即使不是controller中的方法。实现MethodInterceptor拦截器大致也分为两种,一种是实现MethodInterceptor接口,另一种利用Aspect的注解或配置。
二、Mybatis拦截器
2.1、Interceptor
接口
通过拦截Mapper层的方法在方法执行前后加上某些逻辑,也可以在拦截到方法后执行自己的逻辑而不再执行被拦截的方法。
用法:拦截Mapper层的方法进行自定义分表设计
代码演示:
这里扩展一下:分表框架sharding-jdbc,开源sharding-jdbc框架相比自定义分表策略的区别是前者属于重量级,在使用中看你项目需求而定。