当前位置: 首页 > article >正文

SpringMVC 拦截器详解

在 SpringMVC 框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在控制器方法执行前后进行拦截,从而实现诸如权限验证、日志记录、性能监控等功能。本文将深入探讨 SpringMVC 拦截器的原理、配置和使用方法。

一、SpringMVC 拦截器简介

SpringMVC 的拦截器类似于 Servlet 中的 Filter,但它们之间存在一些区别。Filter 是在请求到达 DispatcherServlet 之前进行拦截的,而 SpringMVC 拦截器则是在请求进入 DispatcherServlet 之后,但在控制器方法执行之前进行拦截的。拦截器可以访问请求和响应对象,并且可以根据需要决定是否继续执行后续的拦截器或控制器方法。

二、SpringMVC 拦截器的实现原理

SpringMVC 拦截器通过实现 HandlerInterceptor 接口来定义。该接口包含三个核心方法:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler):在控制器方法执行之前被调用。此方法返回一个布尔值,若返回 true,则继续执行后续的拦截器和控制器方法;若返回 false,则中断请求的执行。

  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):在控制器方法执行之后,但在视图渲染之前被调用。可以对 modelAndView 进行修改。

  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex):在整个请求完成之后被调用,即在视图渲染之后。可以用于进行资源清理等操作。

当一个请求进入 SpringMVC 框架时,DispatcherServlet 会根据配置的拦截器链(Interceptor Chain)来决定是否对请求进行拦截以及如何拦截。拦截器链中的拦截器按照定义的顺序依次执行 preHandle 方法,若所有拦截器的 preHandle 方法都返回 true,则继续执行控制器方法;否则,请求将被中断。

三、SpringMVC 拦截器的配置

在 SpringMVC 中,可以通过以下步骤来配置拦截器:

1. 创建拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    // 在控制器方法执行之前调用
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("preHandle 方法被调用");
        // 这里可以添加自定义的逻辑,比如权限验证
        // 如果返回 false,请求将被中断
        return true;
    }

    // 在控制器方法执行之后,视图渲染之前调用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle 方法被调用");
        // 可以对 modelAndView 进行修改
    }

    // 在整个请求完成之后调用
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion 方法被调用");
        // 可以进行资源清理等操作
    }
}

2. 配置拦截器

在 SpringMVC 的配置文件(通常是 spring-servlet.xml)中,通过 <mvc:interceptors> 标签来配置拦截器:

<mvc:interceptors>
    <!-- 配置全局拦截器,对所有请求生效 -->
    <bean class="com.example.MyInterceptor"/>
    
    <!-- 配置特定路径的拦截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/user/*"/>
        <bean class="com.example.UserInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

注意:在 Spring 3.0 及以上版本中,需要确保启用了 MVC 命名空间(<mvc:annotation-driven/>),否则 <mvc:interceptors> 配置将不会生效。

四、SpringMVC 拦截器的使用场景

1. 权限验证

在实际开发中,权限验证是一个常见的需求。可以通过拦截器来检查用户是否已经登录以及是否具有访问某个资源的权限。例如:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 获取用户登录状态,这里假设登录用户信息存储在 session 中
    Object user = request.getSession().getAttribute("user");
    if (user == null) {
        // 如果用户未登录,重定向到登录页面
        try {
            response.sendRedirect(request.getContextPath() + "/login");
            return false;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 如果用户已登录,继续执行
    return true;
}

2. 日志记录

拦截器可以用于记录请求的相关信息,如请求路径、请求方法、参数等,以便于后续的分析和排查问题:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    System.out.println("请求路径:" + request.getRequestURI());
    System.out.println("请求方法:" + request.getMethod());
    // 打印请求参数
    request.getParameterMap().forEach((key, value) -> {
        System.out.println("参数名:" + key + ",参数值:" + Arrays.toString(value));
    });
    return true;
}

3. 性能监控

通过拦截器可以在请求处理前后记录时间,从而计算出每个请求的处理时间,用于性能监控:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 记录请求开始时间
    long startTime = System.currentTimeMillis();
    request.setAttribute("startTime", startTime);
    return true;
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    // 获取请求开始时间
    Long startTime = (Long) request.getAttribute("startTime");
    // 计算请求处理时间
    long endTime = System.currentTimeMillis();
    long executeTime = endTime - startTime;
    System.out.println("请求处理时间:" + executeTime + "ms");
}

五、总结

SpringMVC 拦截器是 SpringMVC 框架中一个非常实用的功能,它允许开发者在控制器方法执行前后进行拦截,从而实现各种自定义的逻辑。通过合理地使用拦截器,可以提高代码的复用性、可维护性和可扩展性。在实际开发中,可以根据项目的需求灵活地运用拦截器来解决各种问题。


http://www.kler.cn/a/611919.html

相关文章:

  • 堆的常见应用1
  • 细胞内与细胞间网络整合分析!神经网络+细胞通讯,这个单细胞分析工具一箭双雕了(scTenifoldXct)
  • 【机器学习】——机器学习基础概念
  • python进行数据分析(以A 股为例)
  • uniapp开发中store的基本用法和模块化详解
  • uniapp上传图片之前压缩处理
  • 解构 HarmonyOS:技术神话背后的理性审视
  • 给聊天机器人装“短期记忆“:Flask版实现指南
  • 高级数据结构02AVL树
  • AI编程工具哪家强?对比Cusor、Copilot、Cline
  • C++算法深度解析:快速排序的实现、分析与优化
  • RoMA: 基于Mamba的遥感基础模型, 已开源, 首次验证mamba的scaling能力
  • 用数组遍历出来的页面,随节点创建的ref存储在数据仓库中,如果数据删除,页面相关节点也会删除,数据仓库中随节点创建的ref会不会也同时删除
  • STM32F103C8T6移植DMP解算MPU6050
  • Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
  • linux---------进程概念(完)
  • 字节真题,问a,b,c指的地址是否相同?
  • SQL Server常见问题解析
  • 记录react和vue 属性传组件相关的事宜
  • 微软重磅发布 OmniParser V2.0:AI 视觉解析能力跃升,开启界面自动化新时代