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

SpringMVC拦截器

SpringMVC拦截器

  • 什么是拦截器
  • 拦截器和过滤器的区别
  • SpringMVC 拦截器的工作原理
  • 拦截器的配置
    • 拦截器的配置主要有两种方式
      • XML 配置方式
      • Java配置方式
  • 创建一个拦截器
  • 拦截器的应用场景
  • 拦截器的执行顺序

什么是拦截器

SpringMVC 的拦截器(Interceptor)是指在请求处理的不同阶段执行的自定义逻辑。它的作用类似于 Servlet 的过滤器(Filter),但拦截器比过滤器提供了更多的灵活性和控制,可以在请求的不同生命周期内进行拦截。
用于拦截用户的请求并作出相应的处理,比如通过拦截器来进行用户权限验证或者用来判断用户是否登录。SpringMVC拦截器是可插拔式的设计,需要某一功能拦截器,就需要在配置文件中应用拦截器即可;如果不需要这个功能拦截器,只需要在配置文件中取消该拦截器即可。

拦截器和过滤器的区别

  1. 过滤器依赖于servlet,而拦截器技术属于SpringMVC
  2. 过滤器可对所有请求起作用,拦截器只对访问controller层的请求起作用。
  3. 过滤器会比拦截器先执行。拦截器(Interceptor)是在Servlet和Controller控制器之间执行;而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行。

SpringMVC 拦截器的工作原理

SpringMVC 拦截器是通过实现 HandlerInterceptor 接口来定义的,通常有三个方法:

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在请求处理前执行。可以用来进行身份验证、权限检查等操作。如果返回 false,请求会被拦截,不会继续向下执行(即请求不会传递给 Controller 和后续的视图解析过程);如果返回 true,请求会继续传递到 Controller 中。

  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在请求处理后,视图渲染前执行。可以用来修改 ModelAndView,即在 Controller 执行后,但还未渲染视图时进行操作。

  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在请求处理完毕后执行,通常用于资源清理工作。即使请求处理过程中出现了异常,afterCompletion 也会被调用。可以在这里做日志记录等操作。

拦截器的配置

拦截器的配置主要有两种方式

基于 XML 配置和基于 Java 配置

XML 配置方式

在 spring-mvc.xml 中配置拦截器。例如,定义一个拦截器并将其应用到特定的 URL 路径上。

<mvc:interceptors>
    <bean class="com.example.interceptor.MyInterceptor">
        <!-- 这里可以配置拦截器的属性 -->
    </bean>
</mvc:interceptors>


Java配置方式

在 Spring 配置类中配置拦截器。需要实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")  // 拦截所有请求
                .excludePathPatterns("/login", "/register");  // 排除特定的请求
    }
}

创建一个拦截器

拦截器需要实现 HandlerInterceptor 接口,重写其中的三个方法:preHandle、postHandle 和 afterCompletion。

public class MyInterceptor implements HandlerInterceptor {

    // 在请求处理前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle: 请求即将开始处理");
        // 可以进行权限校验、日志记录等操作
        // 如果返回 false,表示拦截该请求,不会继续向下执行
        return true;  // 返回 true 继续执行,返回 false 拦截请求
    }

    // 在请求处理后,视图渲染前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle: 请求处理后,但视图渲染前");
        // 可以修改 ModelAndView,添加额外的模型数据
    }

    // 在整个请求完成后执行(即视图渲染完成后)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion: 请求处理完毕,视图渲染完成");
        // 可以用来做日志记录、清理资源等操作
    }
}

拦截器的应用场景

在这里插入图片描述

拦截器的执行顺序

拦截器的执行顺序是按其在 InterceptorRegistry 中配置的顺序执行的。preHandle 在请求到达 Controller 之前执行,postHandle 在 Controller 执行后但视图渲染前执行,afterCompletion 在视图渲染完成后执行。

!!! 多个拦截器的执行流程:当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

相关文章:

  • 简单聊聊Oracle和MySQL数据库的区别和使用场景
  • 基于yolov11的棉花品种分类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • TDengine 集群节点管理
  • SQL的核心基础语法 | 快速入门MySQL
  • 【mysql疑难杂症】mysql数据库指定ip远程连接数据库
  • Mybatis中 ${} 和 #{} 的区别
  • C++项目:高并发内存池_下
  • dell 台式机 电脑 纽扣电池 如何取下?
  • 【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
  • c#个人向总结
  • 【Linux网络】——Socket网络编程
  • optimization和compression理解
  • conda install 慢
  • Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法
  • 飞速(FS)企业网布线解决方案:赋能能源行业客户高效网络部署与智能化管理
  • 再探带权并查集
  • 麒麟信安全国产化智算一体机与海光C86芯片+ 海光DCU卡完成兼容性适配!
  • Softmax 回归 + 损失函数 + 图片分类数据集
  • LangChain开发(七)自定义输出格式(JSON/XML/YAML)
  • VMware面向公众的存储库 URL 和身份验证机制正在发生变化
  • 共生与伴生:关于人工智能时代艺术评论的对象与主体的思考
  • 独家专访|白先勇:我的家乡不是哪个地点,是中国传统文化
  • 建邦高科赴港上市,大股东陈子淳系山东建邦集团董事长陈箭之子
  • 体坛联播|拜仁提前2轮德甲夺冠,赵心童11比6暂时领先
  • 洪纬读《制造三文鱼》丨毒素缠身的水生鸡
  • 产假工资是谁出?女职工生育能领多少生育津贴?解答来了