有天上飞的概念, 就要有落地的实现
概念十遍不如代码一遍, 朋友, 希望你把文中所有的代码案例都敲一遍
先赞后看, 养成习惯
SpringBoot 图文教程系列文章目录
SpringBoot 图文教程 1「概念 + 案例 思维导图」「基础篇上」 https://mp.weixin.qq.com/s/phk6j3ChBP-kPtS2xZeEZg
SpringBoot 图文教程 2 - 日志的使用「logback」「log4j」 https://mp.weixin.qq.com/s/7Mw_xhFF4Q5NtdtcsHc67Q
SpringBoot 图文教程 3-「'初恋'情结」集成 Jsp https://mp.weixin.qq.com/s/BYzVg5NBcF_ou_PyX8ygag
SpringBoot 图文教程 4-SpringBoot 实现文件上传下载 https://mp.weixin.qq.com/s/6ctykPo3eDBEB7YsC0PAZw
SpringBoot 图文教程 5-SpringBoot 中使用 Aop https://mp.weixin.qq.com/s/17qMRlv_mUfwkcVD05Bh2g
SpringBoot 图文教程 6-SpringBoot 中过滤器的使用 https://mp.weixin.qq.com/s/r2BO4UMNRAw_REA6nNFLKw
本文内容
前言
拦截器是 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
求关注, 求点赞, 求转发
来源: https://www.cnblogs.com/bingyang-py/p/12369220.html