SpringMVC框架自定义拦截器的过程详解

 更新时间:2025年11月24日 09:17:52   作者:好好研究  
文章主要介绍了SpringMVC框架中的拦截器及其工作原理,包括拦截器的定义、执行流程、与过滤器的区别,以及如何自定义和配置拦截器,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一、拦截器

1. 概述

  1. SpringMVC框架中的拦截器用于对处理器(Controller层)进行预处理后处理的技术。
  2. 可以定义拦截器链,拦截器链就是将拦截器按着一定顺序结成一条链,在访问被拦截的方法中,拦截器链中的拦截器会按着定义的顺序执行
  3. 拦截器也是AOP思想的一种实现方法。
  4. 想要自定义拦截器,需要实现HandlerInterceptor接口

2. HandlerInterceptor接口中的方法

  1. preHandle方法:是执行Controller方法前拦截的方法
    • 可以使用request或response跳转到指定的页面。
    • return true拦截,放行,执行下一个拦截器,如果没有拦截器,执行Controller中的方法
    • return false拦截,不放行不执行Controller中的方法
  2. postHandle方法:是执行Controller方法后拦截的方法,在JSP视图执行前
    • 可以使用request或response跳转到指定的页面。
    • 如果跳转到指定的页面,那么Controller方法跳转的页面将不会显示。
  3. afterCompletion方法:是JSP执行后在执行的方法
    • request或response不能再跳转页面了。

3. 拦截器执行流程图

4. 拦截器和过滤器的区别

  1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器。
  2. 拦截器是SpringMVC框架独有的。
  3. 过滤器配置/*,可以拦截任何资源。
  4. 拦截器只会对控制器中的方法进行拦截

二、自定义拦截器

1. 配置一个拦截器

处理器(Controller层)中的方法

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/dept")
@Controller
public class DeptController {
    /**
     * 测试方法
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findALL(){
        System.out.println("测试拦截器,执行了……");
        return "suc";
    }
}

创建拦截器类,实现HandlerInterceptor接口,重写需要的方法

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

在springmvc.xml文件中配置拦截器

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 拦截器之前:拦截controller中的findAll方法,放行,执行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor中的拦截器preHandle方法执行了……");
        // return false - 拦截,不放行;return true - 拦截,放行
        return true;
    }
    /**
     * 拦截器之后:controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor中的postHandle方法执行了……");
        // 可以进行页面跳转
        request.getRequestDispatcher("/pages/suc.jsp").forward(request,response);
        return;
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor中的afterComplrtion方法执行了……");
    }
}

输出结果:

MyInterceptor中的拦截器preHandle方法执行了……
测试拦截器,执行了……
MyInterceptor中的postHandle方法执行了……
MyInterceptor中的afterComplrtion方法执行了……

2. 配置多个拦截器

再编写一个拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 拦截器类
 * 配置多个拦截器
 */
public class MyInterceptor2 implements HandlerInterceptor {
    /**
     * 拦截controller中的方法,但放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor2的拦截器preHandle方法执行了……");
        // 放行
        return true;
    }
    /**
     * controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor2的postHandle方法执行了……");
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor2的afterComplrtion方法执行了……");
    }
}

再springmvc.xml文件中配置多个拦截器类

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
    <!--配置拦截器2-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/**"/>
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

输出结果

MyInterceptor中的拦截器preHandle方法执行了……
MyInterceptor2的拦截器preHandle方法执行了……
测试拦截器,执行了……
MyInterceptor2的postHandle方法执行了……
MyInterceptor中的postHandle方法执行了……
MyInterceptor2的afterComplrtion方法执行了……
MyInterceptor中的afterComplrtion方法执行了……

到此这篇关于SpringMVC框架 - 拦截器的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中抽象类的作用及说明

    Java中抽象类的作用及说明

    这篇文章主要介绍了Java中抽象类的作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 解析JPA的视图查询问题

    解析JPA的视图查询问题

    这篇文章主要是对JPA的视图查询问题进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • JAVA字符串反转的三种方法

    JAVA字符串反转的三种方法

    这篇文章主要介绍了JAVA字符串反转的三种方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • jpa 使用@Column来定义字段类型

    jpa 使用@Column来定义字段类型

    这篇文章主要介绍了jpa使用@Column来定义字段类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • logback自定义日志与Nacos日志冲突问题

    logback自定义日志与Nacos日志冲突问题

    这篇文章主要介绍了logback自定义日志与Nacos日志冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java 线程状态和等待唤醒机制和线程池的实现

    Java 线程状态和等待唤醒机制和线程池的实现

    这篇文章主要介绍了Java 线程状态和等待唤醒机制和线程池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 如何使用bootstrap.yml读取配置中心的配置文件

    如何使用bootstrap.yml读取配置中心的配置文件

    这篇文章主要介绍了如何使用bootstrap.yml读取配置中心的配置文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • mybatis关于Criteria使用的小坑

    mybatis关于Criteria使用的小坑

    这篇文章主要介绍了mybatis关于Criteria使用的小坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java非官方常用类MessageInfo消息接口示例

    java非官方常用类MessageInfo消息接口示例

    这篇文章主要为大家介绍了java非官方常用类MessageInfo消息接口使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Springcloud Bus消息总线原理是实现详解

    Springcloud Bus消息总线原理是实现详解

    Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍
    2022-09-09

最新评论