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实现RTF转Word的完整指南

    Java实现RTF转Word的完整指南

    在企业办公自动化、文档管理系统以及跨平台应用中,文档格式的兼容性问题一直是开发者面临的常见挑战,在实际开发中,如何在 Java 环境下高效地将 RTF 文档转换为 Word 文档是开发者经常遇到的需求,本文将介绍如何使用Java将RTF转换为Word,需要的朋友可以参考下
    2025-12-12
  • 如何使用Spring boot的@Transactional进行事务管理

    如何使用Spring boot的@Transactional进行事务管理

    这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置参数、关键注意事项、调试技巧、最佳实践以及完整示例,感兴趣的朋友一起看看吧
    2025-02-02
  • Java中ArrayList和LinkedList的区别

    Java中ArrayList和LinkedList的区别

    ArrayList和LinkedList在这个方法上存在一定的性能差异,本文就介绍了Java中ArrayList和LinkedList的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java多线程之线程安全问题详解

    Java多线程之线程安全问题详解

    Java中的多线程编程是指使用Java语言创建和控制线程的能力,这篇文章主要介绍了Java多线程之线程安全问题的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • java中Map遍历的四种方式总结

    java中Map遍历的四种方式总结

    Map集合遍历日常开发最常使用,下面这篇文章主要给大家总结介绍了关于java中Map遍历的四种方式,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • Java 后端HTTP 请求(GET/POST)传输规范

    Java 后端HTTP 请求(GET/POST)传输规范

    文章详细阐述了RESTful API设计的最佳实践,涵盖了GET和POST请求的规范、参数传递、响应体、版本控制、日志记录等,本文介绍实例代码介绍了Java后端HTTP请求(GET/POST)传输规范,感兴趣的朋友一起看看吧
    2026-04-04
  • 解决Thymeleaf中onclick的坑

    解决Thymeleaf中onclick的坑

    Thymeleaf中onclick属性无法直接传递字符串参数,需改用data-*属性存储,再通过JS读取,避免模板解析错误,但可能仍有警告
    2025-08-08
  • javacv ffmpeg使用原生ffmpeg命令方式

    javacv ffmpeg使用原生ffmpeg命令方式

    在使用javacv集成ffmpeg进行视频处理时,发现使用ffmpeg-6.0-1.5.9版本出现原生命令执行失败的问题,通过降级至ffmpeg-5.1.2-1.5.8版本,问题得到解决,此外,ffprobe可以用于获取视频属性,需确保视频片段属性一致性
    2024-11-11
  • Java快速掌握Vector类方法

    Java快速掌握Vector类方法

    Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:Vector 是同步访问的;Vector 包含了许多传统的方法,这些方法不属于集合框架
    2022-03-03
  • SpringCloud Feign转发请求头(防止session失效)的解决方案

    SpringCloud Feign转发请求头(防止session失效)的解决方案

    这篇文章主要介绍了SpringCloud Feign转发请求头(防止session失效)的解决方案,本文给大家分享两种解决方案供大家参考,感兴趣的朋友跟随小编一起看看吧
    2020-10-10

最新评论