SpringBoot+Mybatis+PostMan(四):学习拦截器
Springboot+Mybatis+redis+postman项目实战总目录*
SpringBoot+Mybatis+PostMan(五):token登陆认证过程一(token生成与认证)
SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)
SpringBoot+Mybatis+PostMan(六):token登陆认证过程三(redis封装与干掉原来session,避免用户重复登陆)
番外篇:SpringBoot 用户注册时经MD5加密存入数据库
第二篇章:用户角色权限访问控制
SpringBoot+Mybatis+PostMan(七):用户角色权限访问控制入门(数据模拟实现,不带数据库)
SpringBoot+Mybatis+PostMan(八):用户角色权限访问控制一(数据库用户角色表查询组合)
SpringBoot+Mybatis+PostMan(九):用户角色权限访问控制二(加入资源表和资源角色对应表)
SpringBoot+Mybatis+PostMan(十):用户角色权限访问控制三(禁用session、启用token并集成redis)
项目代码获取地址:https://github.com/yeyuting-1314/testdemo_DM5_insert_page_token.git
上一篇我们对过滤器的定义和实现做了详细的介绍,这篇博文来介绍和过滤器有着异曲同工之妙的拦截器,两者功能实现上十分的相似,但是在一部分内容上还是存在一定的区别。
相对于过滤器,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。二者区别总结如下:
Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
现在来实现拦截器。
1. 实现特定拦截器(我们这里实现的拦截器和上一篇过滤器实现一样的功能)
//拦截器实现 完成和过滤器一样的功能 需要实现HandlerInterceptor这个接口 public class LogCostInterceptor implements HandlerInterceptor { long start = System.currentTimeMillis() ; //preHandle是请求执行前执行的 @Override public boolean preHandle(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o) throws Exception{ start = System.currentTimeMillis() ; return true ; } //postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行 @Override public void postHandle(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , ModelAndView modelAndView)throws Exception{ System.out.println("Interceptor cost1 = " + (System.currentTimeMillis()-start)); } //afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作 @Override public void afterCompletion(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , Exception e)throws Exception{ } }
2. 拦截器配置:
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**") ; WebMvcConfigurer.super.addInterceptors(registry); } }
这样以来,拦截器就初步配置完毕,在前端访问某一网页,实现拦截器访问前后时间差计算。
这样一来,拦截器也顺利实现。
至此,结束。