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 图形界面编程 AWT篇(1)

    前言 为了完成JAVA课程设计,我踏上了Java图形界面编程的学习之旅,通过撰写博客记录我的学习过程和心得。 AWT(Abstract Window Toolkit)概览 AWT(抽象窗口工具包)是Java早期的图形用户界面(GUI)框架之一,主要被用于构建桌面应用程序的图形界面。它最初在JDK 1.0版本中作为Java GUI的核心库引入,目的是提供一个能…

    未分类 2024 年 12 月 28 日
    40100
  • Redis Java 集成到 Spring Boot

    # Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~ ## 📚 本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。 ![在这里插入图片描述](https://pic.it1024doc.com/csdn/202412/ca054e533844dc927c24e57c1713f…

    2024 年 12 月 27 日
    38200
  • 扣子又出新功能,支持一键部署小程序,太强了!!

    大家好,我是R哥。 作为一名程序员和技术博主,我一直关注如何使用工具提升生产力,尤其是在内容创作和应用开发领域。 拿我开发一个微信小程序为例,我需要懂前端、后端、运维 等全栈技术,开发流程和技术栈复杂,我还需要购买云服务器、云数据库 等各种基础设施,资源耗费非常多。 虽然现在有如 Cursor 这样的革命性 AI 开发工具,它突破了传统开发模式的壁垒,非开发…

    2025 年 1 月 13 日
    23100
  • Redis 8.0重磅登场:全面开源与性能飞跃

    各位技术爱好者,我是技术观察员T哥。近日,Redis团队带来一个激动人心的公告:Redis 8.0版本正式亮相! 这次升级不仅是简单的版本更新,更代表着重要的战略转变——官方宣布恢复完全开源模式!可能有人会疑惑:Redis不是一直开源的吗?事实并非如此。自Redis 7.4版本起,其核心授权协议已经变更:Redis 7.4实际上采用了SSPLv1(受限开源)…

    2025 年 5 月 12 日
    32000
  • 促销系统:促销活动、优惠券、优惠规则概念模型设计

    大家好,我是汤师爷~ 概念模型设计是促销系统开发的关键环节,我们需要基于之前的功能分析,将复杂的促销业务拆解成清晰的领域概念,这些概念之间的关系界定和边界划分,将直接决定系统的可维护性和扩展性。 促销系统核心概念模型 通过对促销业务的分析,我们可以抽象出促销系统的关键概念模型。 1、促销活动模型 促销活动模型对活动的各个要素和规则进行抽象,包含活动名称、描述…

    2025 年 1 月 6 日
    44900

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信