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

相关推荐

  • 『玩转Streamlit』–上传下载文件

    在Web应用中,文件的上传下载 是交互中不可缺少的功能。 因为在业务功能中,一般不会只有文字的交互,资料或图片的获取和分发是很常见的需求。 比如,文件上传 可让用户向服务器提交数据,如上传图片分享生活、提交文档用于工作协作等,丰富应用功能。 而文件下载 则使用户能获取服务器端的资源,像下载软件、报告等,提升用户对应用内容的获取能力,增强用户体验和应用实用性。…

    2024 年 12 月 30 日
    74900
  • 为什么在 Python 中 hash(-1) == hash(-2)?

    英文:https://omairmajid.com/posts/2021-07-16-why-is-hash-in-python 作者:Omair Majid 译者:豌豆花下猫&Claude-3.5-Sonnet 时间:原文发布于 2021.07.16,翻译于 2025.01.11 收录于:Python为什么系列 https://github.com/chi…

    未分类 2025 年 1 月 16 日
    56200
  • Claude Pro充值国内支付账号操作流程

    Claude Pro充值国内支付账号操作流程,适合需要处理长稿件的内容编辑在国内使用微信支付宝为自己的账号开通 Claude Pro,并用于报告框架梳理与论证链条补充。

    未分类 2026 年 8 月 26 日
    15700
  • Claude Pro微信支付宝代充流程

    国内用户如何开通Claude Pro?本文整理Claude充值、Claude代充、微信支付宝付款和Organization ID确认流程。

    未分类 2026 年 6 月 4 日
    29100
  • JetBrains 官方正版账号,全家桶全版本全平台都可激活

    官方授权,激活你自己的JetBrains账号,1年只要66元! 平均一个月不到6块钱!(共享单车一个月都要9.9元了!) 有一个账号有什么优势? 激活您自己的专属账号(官网可查) 不限制任何版本,所有版本登录账号即可使用 不限制任何产品,无论是IDEA、DataGrip、PyCharm、WebStorm等17个工具都直接使用 不需要任何配置,登录你的账号就可…

    2024 年 6 月 22 日
    2.8K00

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信