当前位置: 首页 > news >正文

【SpringMVC】6—SpringMVC拦截器

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆


文章目录

  • 6 SpringMVC拦截器
    • 6.1 概念
      • 拦截器VS过滤器
        • 相似点
        • 不同点
        • 选择
    • 6.2 使用
      • 6.2.1 创建拦截器类
        • 实现接口
      • 6.2.2 注册拦截器
        • 默认拦截全部请求
        • 配置拦截路径
        • 配置不拦截路径
      • 6.2.3 执行顺序

6 SpringMVC拦截器

6.1 概念

在这里插入图片描述

拦截器VS过滤器

相似点

三要素相同

  • 拦截:必须先把请求拦住,才能执行后续操作;
  • 过滤:拦截器或过滤器存在的意义就是对请求进行统一处理;
  • 放行:对请求执行了必要操作后,放请求过去,让它访问原本想要访问的资源;

不同点

  • 工作平台不同
    • 过滤器工作在 Servlet 容器中
    • 拦截器工作在 SpringMVC 的基础上
  • 拦截的范围
    • 过滤器:能够拦截到的最大范围是整个 Web 应用
    • 拦截器:能够拦截到的最大范围是整个 SpringMVC 负责的请求
  • IOC 容器支持
    • 过滤器:想得到 IOC 容器需要调用专门的工具方法,是间接的
    • 拦截器:它自己就在 IOC 容器中,所以可以直接从 IOC 容器中装配组件,也就是可以直接得到 IOC 容器的支持

选择

功能需要如果用 SpringMVC 的拦截器能够实现,就不使用过滤器。

6.2 使用

6.2.1 创建拦截器类

实现接口

public class Process01Interceptor implements HandlerInterceptor {Logger logger = LoggerFactory.getLogger(this.getClass());// 在处理请求的目标 handler 方法前执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.debug("Process01Interceptor preHandle方法");// 返回true:放行// 返回false:不放行return true;}// 在目标 handler 方法之后,渲染视图之前@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {logger.debug("Process01Interceptor postHandle方法");}// 渲染视图之后执行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {logger.debug("Process01Interceptor afterCompletion方法");}
}

单个拦截器执行顺序:

  • preHandle()方法
  • 目标handler方法
  • postHandle()方法
  • 渲染视图
  • afterCompletion()方法

在较低版本的 SpringMVC 中,实现HandlerInterceptor接口需要把所有抽象方法都实现。但是又不是每个方法都需要使用,导致代码比较繁琐。

此时可以通过继承HandlerInterceptorAdapter类同样可以创建拦截器类。HandlerInterceptorAdapter类中已经给 HandlerInterceptor接口提供了默认实现,我们继承后不需要把每个方法都实现,只需要把有用的方法重写即可。

在 SpringMVC 较高版本(例如:5.3版本以上)中,HandlerInterceptor 接口已经借助JDK1.8新特性让每个抽象方法都给出了默认实现,所以HandlerInterceptorAdapter这个类被标记为过时。

6.2.2 注册拦截器

默认拦截全部请求

<!-- 注册拦截器 -->
<mvc:interceptors><!-- 直接通过内部 bean 配置的拦截器默认拦截全部请求(SpringMVC 范围内) --><bean class="com.atguigu.mvc.interceptor.Process01Interceptor"/>
</mvc:interceptors>

配置拦截路径

精确匹配:

<!-- 具体配置拦截器可以指定拦截的请求地址 -->
<mvc:interceptor><!-- 精确匹配 --><mvc:mapping path="/common/request/one"/><bean class="com.atguigu.mvc.interceptor.Process03Interceptor"/>
</mvc:interceptor>

匹配单层路径:

<mvc:interceptor><!-- /*匹配路径中的一层 --><mvc:mapping path="/common/request/*"/><bean class="com.atguigu.mvc.interceptor.Process04Interceptor"/>
</mvc:interceptor>

匹配多层路径:

<mvc:interceptor><!-- /**匹配路径中的多层 --><mvc:mapping path="/common/request/**"/><bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>

配置不拦截路径

<mvc:interceptor><!-- /**匹配路径中的多层 --><mvc:mapping path="/common/request/**"/><!-- 使用 mvc:exclude-mapping 标签配置不拦截的地址 --><mvc:exclude-mapping path="/common/request/two/bbb"/><bean class="com.atguigu.mvc.interceptor.Process05Interceptor"/>
</mvc:interceptor>

6.2.3 执行顺序

  • preHandle()方法:SpringMVC 会把所有拦截器收集到一起,然后按照配置顺序调用各个preHandle() 方法;
  • 目标 handler 方法;
  • postHandle()方法:SpringMVC会把所有拦截器收集到一起,然后按照配置相反的顺序调用各个postHandle()方法;
  • 渲染视图;
  • afterCompletion()方法:SpringMVC 会把所有拦截器收集到一起,然后按照配置相反的顺序调用各个 afterCompletion() 方法;
http://www.lryc.cn/news/56590.html

相关文章:

  • 【算法】插入排序
  • java servlet 期刊在线投稿系统jsp编程sqlserver数据库mvc模式开发计算机网页设计
  • 命名空间和程序集
  • 108、指针进阶
  • arm平台交叉编译rt-tests
  • Melis4.0[D1s]:5.测试笔记 - 修改显示测试源码
  • yolov7目标检测:基于自定义数据集完成检测、训练、测试
  • 托福高频真词List13 // 附托福TPO阅读真题
  • 动力节点王鹤SpringBoot3笔记——第八章 文章管理模块
  • ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试
  • iOS 内存管理机制与原理
  • Linux之父:连你自己都懒得解释,那这就是一堆垃圾!
  • 二战华为成功上岸,准备了小半年,要个27k应该也算不上很高吧~
  • 全国青少年电子信息智能创新大赛(复赛)python·模拟三卷,含答案解析
  • 服务网关选型指南
  • 华为OD机试-查找充电设备组合-2022Q4 A卷-Py/Java/JS
  • 免费好用的oa系统有哪些?盘点这几款!
  • 光伏发电系统模拟及其发电预测开源python工具pvlib
  • 精彩回顾 | 2023工赋Meetup—上海站
  • [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式
  • DNS 的解析过程以及相关问题
  • 个人情况-单词练习
  • python天狗吃月 青少年编程电子学会python编程等级考试一级真题解析2022年9月
  • JAVA做语言国际化
  • 面试题 16.19. 水域大小
  • 在vscode中切换分支,显示已经删除的远程分支
  • 森林督查违法图斑内业报告高效制作实践技术
  • 华为OD机试-日志限流-2022Q4 A卷-Py/Java/JS
  • ChatGPT能胜任高级程序员吗?
  • effective c++ item 25-29