有天上飞的概念,就要有落地的实现
概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍先赞后看,养成习惯SpringBoot 图文教程系列文章目录
SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」SpringBoot图文教程2—日志的使用「logback」「log4j」SpringBoot图文教程3—「‘初恋’情结」集成JspSpringBoot图文教程4—SpringBoot 实现文件上传下载SpringBoot图文教程5—SpringBoot 中使用AopSpringBoot图文教程6—SpringBoot中过滤器的使用本文内容
前言拦截器是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言,拦截器要的控制更加的细节,拦截器可以在三个地方进行执行。
可以在请求到达Controller控制器之前 通过拦截器执行一段代码也可以在控制器执行之后,通过拦截器执行一段代码 【此时只是Controller执行完毕 视图还没有开始渲染】最后在整个请求结束的时候还可以通过拦截器执行一段时间代码整个工作过程如下图
SpringBoot中拦截器的使用需求:在项目中创建一个UserController,然后在UserController的前后使用拦截器打印一些信息
所以首先我们开发一个UserController
拦截器使用的开发步骤
创建拦截器类注册拦截器 配置拦截规则创建拦截器类/** * @Component 和 @Service 是一个作用 创建对象 */ @Component public class MyInterceptor1 implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(MyInterceptor1.class); /** * 在请求到达Controller控制器之前 通过拦截器执行一段代码 * 如果方法返回true,继续执行后续操作 * 如果返回false,执行中断请求处理,请求不会发送到Controller */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("拦截器1 在控制器执行之前执行"); return true; } /** * 控制器之后,跳转前 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("拦截器1 在控制器执行之后执行"); } /** * 跳转之后执行 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("拦截器1 最后执行"); } }注册拦截器,配置拦截规则@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyInterceptor1 myInterceptor1; /** * 注册拦截器 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { /** * addInterceptor 注册拦截器 * addPathPatterns 配置拦截规则 */ registry.addInterceptor(myInterceptor1) .addPathPatterns("/**"); } }细节补充postHandle方法中ModelAndView参数在postHandle方法中有一个参数是ModelAndView。这个对象在SpringMvc中是一个关键对象,可以进行参数传递和路径跳转。
ModelAndView 向request作用域存入数据:mav.addObject("作用域数据的name",值); 设置跳转路径:mav.setViewName("跳转方式:/目标资源url-pattern"); 作用:model作用+跳转路径的作用
public ModelAndView xxx(ModelAndView mav){ //1. 向requset作用域存入一个数据 mav.addObject("name",值); //2. 跳转到xxx.jsp mav.setViewName("跳转方式:/目标资源url-pattern"); return mav; }通过ModelAndView 我们可以在 postHandle方法中 操作作用域的值 和 设置修改跳转路径
一次性拦截多个路径在注册拦截器的时候 配置拦截路径的addPathPatterns参数为可变长参数,就意味着可以接受String的数组,可以配置多个参数。
addPathPatterns方法的源码如下
排除拦截路径 注册多个拦截器我们可以实现多个拦截器,并依次将他们注册进去
public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor1) .addPathPatterns("/**"); registry.addInterceptor(myInterceptor2) .addPathPatterns("/**"); }关于多个拦截器的执行顺序设置
在不做任何设置的时候,多个拦截器的执行顺序和注册的顺序有关,先注册的先执行 也可以通过Order方法来设置 执行的顺序 值越小越先执行 总结以上就是SpringBoot中拦截器的简单使用。
让我们再次回顾本文的学习目标
掌握SpringBoot中拦截器的使用要掌握SpringBoot更多的用法,请持续关注本系列教程。
下面体贴的我给朋友萌还准备了一些 自测面试题和项目案例,希望你能够成热打铁,将知识夯扎实。
自测面试题(答案见下期)拦截器和过滤器有什么区别?上期自测面试题答案,见面试题集锦 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
自测实现项目小案例(答案见下期)本次需求:
练习文中demo
上期自测实现项目小案例答案,见码云仓库 https://gitee.com/bingqilinpeishenme/Lu-JavaNodes
---来自腾讯云社区的---鹿老师的Java笔记
微信扫一扫打赏
支付宝扫一扫打赏