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

相关推荐

  • java: JDK isn‘t specified for module ‘product-service‘问题解决

    目录 问题 解决方法 1.打开File->Project Structure… 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12,并Apply,OK 问题 添加module后报错:java: JDK isn’t specified for module ‘product-service’ 查看pom.xml文件也添加了…

    2025 年 1 月 19 日
    47200
  • manim边学边做–改变动画速度

    ChangeSpeed类是Manim库中用于修改动画速度的类。 它提供了一种灵活的方式来控制动画的播放速度,使动画在不同时间段内以不同的速度播放,从而创造出更加丰富多样的动画效果。 比如,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制不同元素在不同时间点的移动速度,实现复杂的动画节奏编排。 1. 动画概述 与之前介绍的那些动画类不同,…

    2025 年 1 月 6 日
    36900
  • Java Druid 面试题

    Druid连接池在项目中有哪些优势? 性能优越:Druid采用了高效的连接管理机制,可以快速地创建和回收数据库连接,减少了连接的创建和销毁带来的性能开销。 监控与统计:Druid提供了详细的监控信息,包括连接池的状态、SQL执行的统计信息等,这有助于性能调优和问题诊断。 SQL日志记录:Druid内置了SQL执行日志记录功能,可以记录所有SQL语句的执行情况…

    未分类 2025 年 1 月 10 日
    49400
  • IoC究竟是什么?——IoC的基础分析

    IoC全称Inversion of Control,直译为控制反转。这是一种设计理念,并非技术。在明白控制反转之前,应该知道“反转”反的是什么。 被反转的正转 我们从生活中的做饭场景开始。 在家做菜与餐馆吃饭 我们在做饭的时候有很多个步骤,需要准备原料,厨具等等。最后通过一定的顺序加入我们的原料,再进行翻炒等烹饪操作就能够得到一份菜了。我们想吃一份菜不一定需…

    未分类 2025 年 1 月 13 日
    48700
  • 免费将PDF转换为图片的实用指南

    引言 各位朋友好,我是小徐。在日常的Java开发工作中,处理PDF文档是常见需求之一。为了提升工作效率,今天我将分享一个无需付费、无水印的PDF转图片方法。让我们一起来探索吧! 轻松实现PDF转图片(零成本) 第一步,通过微信搜索功能,输入”PDF编辑器小帮手”进行查找,认准正确的小程序图标进入。您也可以直接点击文中的小程序链接快速访问。进入后,在功能界面选…

    2025 年 5 月 15 日
    31200

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信