SpringMVC-08-拦截器

1、拦截器概述

在SpringMVC框架中,处理器拦截器扮演着与Servlet过滤器(Filter)相似的角色,它们负责对处理器(Handler)进行预处理和后处理。开发者可以自定义拦截器以实现特定的业务需求。

过滤器与拦截器的主要区别:

  • 过滤器
    • 是servlet规范的一部分,适用于任何JavaWeb项目。
    • 通过在url-pattern中配置/*,可以对所有访问的资源进行过滤。
  • 拦截器
    • 是SpringMVC特有的,仅在SpringMVC项目中可用。
    • 仅拦截进入SpringMVC框架的请求,即进入DispatcherServlet的请求。
    • 对于.jsp等资源请求,拦截器不会生效,因为这些请求并未进入DispatcherServlet,而是直接由Tomcat的JspServlet处理。

拦截器是面向切面编程(AOP)思想的实践体现。

2、拦截器使用

自定义拦截器

如何实现自定义拦截器呢?首先,需要实现HandlerInterceptor接口。

public interface HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}
  • preHandle:在处理器执行之前执行。
    • 返回true:继续执行下一个拦截器或处理器。
    • 返回false:中断请求处理链,需要自行处理请求和响应。
  • postHandle:在处理器执行之后,视图解析器解析视图之前执行。
    • 可以修改ModelAndView来控制模型数据和即将跳转的视图(仅限于返回逻辑视图名的处理器)。
  • afterCompletion:在请求处理完成后执行(即视图渲染后)。
    • 无论处理器是否正常执行(可能抛出异常),此方法都会执行。
    • 类似于try-catch中的finally,常用于资源清理和异常处理。

自定义拦截器MyInterceptor

public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
        System.out.println("------------preHandle------------");

        return !"false".equals(httpServletRequest.getParameter("status"));
    }

    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("------------postHandle------------");
    }

    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("------------afterCompletion------------");
        System.out.println(e);
        if (e != null)
            httpServletRequest.getRequestDispatcher("/").forward(httpServletRequest, httpServletResponse);
    }
}

配置拦截器

在Spring的配置文件中定义拦截器:



    
        
        
        
        
        
        
        
    

  • mvc:mapping:定义拦截器映射的路径。
  • mvc:exclude-mapping:在映射拦截路径中排除的路径。
  • bean:配置的拦截器类。

测试

添加Controller

@RestController
public class TestController {

    @RequestMapping("test1")
    public String test1() {
        System.out.println("Handler执行");
        return "hello";
    }
}
  • 拦截器拦截:后续处理链不会执行。

  • 拦截器放行:请求正常处理。

  • 处理器出现异常:postHandle不会执行,异常被afterCompletion捕获,并由afterCompletion处理请求。

3、拦截器执行顺序

添加MyInterceptor2

```java
public class MyInterceptor2 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
System.out.println("------------preHandle-2------------");
return true;
}

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4281.html

(0)
LomuLomu
上一篇 2024 年 12 月 24 日 下午2:41
下一篇 2024 年 12 月 24 日 下午2:41

相关推荐

  • 【2024最新版可用】Intellij IDEA破解教程,附IDEA激活码

    IntelliJ IDEA 是一种广受欢迎的 Java 集成开发环境,被认为是最佳的 Java 开发工具之一。本文将分享如何通过脚本免费激活 IDEA 及 Jetbrains 全家桶工具,支持 2021 及以上版本,包括最新版本。 一、下载并安装 IDEA 首先,前往 JetBrains 官网下载最新版本的 IDEA。安装过程非常简单,按照提示一步步操作即可…

    未分类 2024 年 7 月 15 日
    2.5K00
  • 10个案例告诉你mysql不使用子查询的原因

    大家好,我是 V 哥,上周跟一个哥们吃饭,技术人在一起,你知道的,没聊上一会儿,就转到技术问题探讨上了,其中聊到数据库子查询的问题印象深刻,回来整理了以下10个案例说明不使用子查询的问题,分享给大家。 首先,来说一下在MySQL中,不推荐使用子查询和JOIN的原因,主要有以下几点: 性能问题 :子查询在执行时,MySQL需要创建临时表来存储内层查询的结果,查…

    未分类 2024 年 12 月 30 日
    44700
  • Java技术前沿——大数据机器学习在金融衍生品风险建模中的创新实践(244)

    🌟亲爱的技术探索者们,诚挚欢迎来到【云端科技驿站】!在这个数字化浪潮奔涌的时代,我们共同搭建了一个融合创新与实用的技术交流平台。这里不仅有前沿的技术解析,更期待您分享独到见解,让我们携手在科技海洋中扬帆远航!🌟全网平台(微信公众号/CSDN/抖音/华为/支付宝/微博):云端科技一、加入【技术精英联盟】快速通道1:【云端科技精英社群(2024新版)】快速通道2…

    2025 年 5 月 19 日
    41000
  • Mysql

    MySQL 学习整理 MySQL 基础架构 最上层的客户端所包含的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器工具或服务器都有类似的服务,包括连接处理、身份验证、确保安全性等。 第二层包含了大多数 MySQL 的核心功能,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:…

    2025 年 1 月 6 日
    53800
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

    目录 一、ThreadLocal基本知识回顾分析 (一)ThreadLocal原理 (二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null? (三)ThreadLocal中的内存泄漏问题及JDK处理方法 (四)部分核心源码回顾 ThreadLocal.set()方法源码详解 ThreadLocalMap.get()方法详解 Th…

    2025 年 1 月 10 日
    49300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信