SpringMVC 框架中的拦截器

一、拦截器

  1. SpringMVC拦截器作用 用于对处理器(Controller)进行预处理后处理

  2. 拦截器链 多个拦截器可以按顺序组成一条链,访问被拦截方法时,会按配置顺序执行

  3. 拦截器 vs 过滤器

    • 过滤器是Servlet规范 的一部分,所有 Web框架都能用
    • 拦截器是SpringMVC独有的技术
    • 过滤器配置 /* 可以拦截所有资源(jsp、css、js、controller)
    • 拦截器只会拦截Controller方法
    • 拦截器是AOP 思想的具体实现
  4. 自定义拦截器要求 必须实现 HandlerInterceptor 接口

二、自定义拦截器步骤

1. 控制器:DeptController.java

java 复制代码
package cn.tx.demo4;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 测试拦截器
 */
@Controller
@RequestMapping("/dept")
public class DeptController {

    /**
     * 测试方法
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findAll(){

        System.out.println("controller方法执行了...");

        return "suc";
    }

}

2. 自定义拦截器:MyInterceptor2.java

java 复制代码
package cn.tx.demo4;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器类
 */
public class MyInterceptor2 implements HandlerInterceptor{

    /**
     * 拦截controller中方法。放行了,执行controller中方法。
     * return true 放行
     * return false 拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle方法执行了...");
        // 手动跳转页面
        // request.getRequestDispatcher("/index.jsp").forward(request,response);
        // 拦截,不放行
        //return false;
        // 放行
        return true;
    }

}

3. 在 springmvc.xml 中配置拦截器

java 复制代码
<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器-->
    <mvc:interceptor>
        <!--该拦截器拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--哪些资源不想拦截
        <mvc:exclude-mapping path="" />
        -->
        <!--拦截器对象-->
        <bean class="cn.tx.demo4.MyInterceptor2" />
    </mvc:interceptor>
</mvc:interceptors>

三、HandlerInterceptor 接口中的 3 个方法

1. preHandle( )

  • Controller 方法执行前调用
  • return true:放行,执行下一个拦截器 / Controller
  • return false:拦截,不执行 Controller
  • 可以使用 request/response 跳转页面

2. postHandle( )

  • Controller 方法执行后,JSP 渲染前调用
  • 可以修改 ModelAndView,改变跳转页面
  • 若手动跳转,Controller 指定页面不会显示

3. afterCompletion( )

  • JSP 页面执行完毕后,最后执行
  • 一般用于资源清理
  • 不能再跳转页面

完整 3 个方法的拦截器:MyInterceptor2.java

java 复制代码
package cn.tx.demo4;

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中方法。放行了,执行controller中方法。
     * return true 放行
     * return false 拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle方法执行了...");
        return true;
    }

    /**
     * controller方法执行后,要拦截的方法
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法执行了...");
        // 可以进行页面的跳转
        // request.getRequestDispatcher("/index.jsp").forward(request,response);
    }

    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法执行了...");
    }

}

四、配置多个拦截器(拦截器链)

1. 第二个拦截器:MyInterceptor3.java

java 复制代码
package cn.tx.demo4;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器类
 */
public class MyInterceptor3 implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor3的preHandle方法执行了...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor3的postHandle方法执行了...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor3的afterCompletion方法执行了...");
    }

}

2. springmvc.xml 配置两个拦截器

java 复制代码
<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <mvc:mapping path="/dept/**"/>
        <bean class="cn.tx.demo4.MyInterceptor2" />
    </mvc:interceptor>

    <!--配置拦截器2-->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="cn.tx.demo4.MyInterceptor3" />
    </mvc:interceptor>
</mvc:interceptors>

五、多拦截器执行顺序

  1. preHandle:顺序执行拦截器 1 → 拦截器 2 → Controller

  2. postHandle:逆序执行Controller → 拦截器 2 → 拦截器 1

  3. afterCompletion:逆序执行页面渲染完 → 拦截器 2 → 拦截器 1

六、运行控制台输出

java 复制代码
拦截器preHandle方法执行了...
MyInterceptor3的preHandle方法执行了...
controller方法执行了...
MyInterceptor3的postHandle方法执行了...
postHandle方法执行了...
MyInterceptor3的afterCompletion方法执行了...
afterCompletion方法执行了...
相关推荐
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案6 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅7 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp7 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4777 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
程序员天天困7 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
战血石LoveYY8 小时前
Integer类型超限,导致数据异常
java·算法
乐观的Terry9 小时前
1、为什么要自己造发布系统
java·spring boot·后端·spring cloud·架构
兰令水9 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
嗝屁小孩纸9 小时前
Maven版本升级&Nexus推送极简执行步骤
java·elasticsearch·maven