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

SpringMVC拦截器深度解析与实战

引言

Spring MVC作为Spring框架的核心模块之一,主要用于构建Web应用程序和RESTful服务。在Spring MVC中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理流程的特定点插入自定义代码,实现诸如权限验证、日志记录、请求预处理等功能。本文将深入解析Spring MVC拦截器的概念、工作原理、使用场景以及实现方式,并通过代码示例进行演示。

拦截器概念

什么是拦截器

拦截器(Interceptor)是Spring MVC中用于动态拦截请求处理流程的一种机制。在请求到达控制器(Controller)之前或响应返回给客户端之后,拦截器可以对请求和响应进行预处理和后处理。拦截器是AOP(面向切面编程)思想在Spring MVC中的具体实现之一。

拦截器与过滤器的区别

拦截器和过滤器(Filter)在Web开发中经常被提及,但它们之间存在明显的区别:

  • 作用范围:过滤器可以拦截几乎所有的请求,包括静态资源,而拦截器只能拦截到控制器(Controller)中的请求方法。
  • 依赖关系:过滤器依赖于Servlet容器,而拦截器不依赖于Web容器,是Spring MVC的组件。
  • 灵活性:拦截器可以方便地访问Spring容器中的bean,而过滤器则相对困难。

拦截器的作用

拦截器主要用于在请求处理流程中的特定点执行自定义逻辑,其作用包括但不限于:

  • 权限验证:检查用户是否拥有访问某个资源的权限。
  • 日志记录:记录请求和响应的详细信息,便于问题追踪。
  • 请求预处理:在请求到达控制器之前对请求数据进行修改或补充。
  • 响应后处理:在响应返回给客户端之前对响应数据进行修改或添加额外的头信息。

拦截器的实现

定义拦截器

在Spring MVC中,定义一个拦截器需要实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。HandlerInterceptor接口包含三个方法:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler): 在请求处理之前进行调用(Controller方法调用之前)。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView): 请求处理之后进行调用,但在视图被渲染之前(Controller方法调用之后,DispatcherServlet渲染视图之前)。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex): 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图执行之后。

示例代码

以下是一个简单的拦截器实现示例:

java

package com.example.interceptor;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@Component 

public class MyInterceptor implements HandlerInterceptor {

@Override 

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

System.out.println("在Controller方法执行前执行");

// 可以进行权限验证等操作,如果验证失败,返回false以中断后续流程

return true;

}

@Override 

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

System.out.println("在Controller方法执行后,视图渲染前执行");

// 可以对ModelAndView进行修改

if (modelAndView != null) {

modelAndView.addObject("customAttribute", "自定义属性值");

}

}

@Override 

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

System.out.println("在所有请求处理完成后执行");

// 进行资源清理等操作

}

}

配置拦截器

定义拦截器后,需要在Spring MVC配置中注册该拦截器,并指定其拦截的路径。在Spring Boot项目中,通常通过实现WebMvcConfigurer接口并重写addInterceptors方法来完成:

当然,下面是继续完成WebConfig类的实现,包括如何将自定义的拦截器添加到Spring MVC的拦截器链中,并指定其拦截的路径。

完成WebConfig配置

java

package com.example.config;

import com.example.interceptor.MyInterceptor;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration 

public class WebConfig implements WebMvcConfigurer {

@Autowired 

private MyInterceptor myInterceptor;

@Override 

public void addInterceptors(InterceptorRegistry registry) {

// 添加拦截器,并设置拦截路径和排除路径

registry.addInterceptor(myInterceptor)

.addPathPatterns("/**") // 拦截所有请求

.excludePathPatterns("/static/**", "/error"); // 排除静态资源和错误页面的拦截

}

}

在这个配置中,addInterceptors方法通过InterceptorRegistry注册了MyInterceptor拦截器,并使用addPathPatterns方法指定了拦截器需要拦截的路径模式(在这个例子中是所有请求,即/**)。同时,使用excludePathPatterns方法排除了静态资源(如/static/**)和错误页面(/error)的拦截,这是为了避免对不需要拦截的资源进行不必要的处理。

拦截器的使用场景

  1. 权限控制:在preHandle方法中检查用户是否拥有访问某个资源的权限,如果没有则直接返回错误响应或重定向到登录页面。
  2. 日志记录:在preHandleafterCompletion方法中记录请求和响应的详细信息,包括请求参数、IP地址、处理时间等,有助于问题的追踪和系统的监控。
  3. 请求预处理:在preHandle方法中修改请求参数、设置请求头或执行其他预处理操作。
  4. 响应后处理:在postHandle方法中修改响应内容或状态码,或在afterCompletion方法中执行一些清理工作。
  5. 性能监控:在preHandleafterCompletion方法中记录时间戳,计算请求处理时间,从而监控系统的性能。

注意事项

  • 拦截器的执行顺序:在Spring MVC中,拦截器的执行顺序是通过它们在InterceptorRegistry中的注册顺序来决定的。如果需要改变执行顺序,可以调整注册的顺序。
  • 拦截器链的传递性:在preHandle方法中返回false将中断拦截器链的后续执行,并直接跳到afterCompletion方法(如果存在)。如果返回true,则继续执行下一个拦截器的preHandle方法或最终执行控制器的目标方法。
  • 拦截器的错误处理:在拦截器链中的任何位置发生异常时,都会依次执行已调用拦截器的afterCompletion方法(如果有的话),即使异常发生在preHandle方法中也是如此。

通过上述解析和示例,你应该对Spring MVC中的拦截器有了更深入的理解,并能够在实际项目中灵活运用它们来增强Web应用的功能和性能。

http://www.lryc.cn/news/431577.html

相关文章:

  • 直线上最多的点数
  • 经济管理专业数据库介绍
  • 【C++ Primer Plus习题】11.1
  • [数据库][oracle]ORACLE EXP/IMP的使用详解
  • 中国各银行流动性比例数据(2000-2022年)
  • MACOS安装配置前端开发环境
  • Docker 配置国内镜像源
  • AI模块在人工智能中扮演着什么样的角色
  • VM Workstation虚拟机AlmaLinux 9.4操作系统安装(桌面版安装详细教程)(宝塔面板的安装),填补CentOS终止支持维护的空白
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(三)- 3GPP Release17 内容
  • 【SQL】常见语句合集
  • Cozer必备!一站式解锁扣子全网最全插件集锦(三)
  • 1-2宿主环境
  • Java进阶13讲__第九讲
  • 上海市计算机学会竞赛平台2024年8月月赛丙组等差数列的素性
  • VR虚拟展厅的应用场景有哪些?
  • Go 语言版本管理——Goenv
  • C#中的各种画刷, PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别
  • 如何在Mac中修改pip的镜像源
  • MySQL你必须知道的事
  • Ceph RBD使用
  • Spark MLlib模型训练—回归算法 Random forest regression
  • 华为OD机试真题-数大雁-2024年OD统一考试(E卷)
  • Oracle数据迁移:导出与导入的详细指南
  • SpringBoot实现前后端传输加密设计
  • X 射线测厚仪-高效精准,厚度测量的卓越之选
  • 10款好用的文件加密软件排行榜|文件加密管理软件推荐(合集篇)
  • 服务器蓝屏该怎么办
  • Elasticsearch:使用 inference API 进行语义搜索
  • PVE开启核显直通