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

java中实现自定义拦截器

java中实现自定义拦截器

在 Java 中实现自定义拦截器,最常见的场景是在 Spring MVC 框架中使用。Spring MVC 的拦截器(Interceptor)可以对请求进行预处理和后处理,常用于日志记录、权限验证、性能监控等场景。

核心概念

  • HandlerInterceptor 接口::这是Spring MVC 定义的用于创建拦截器的接口,它包含三个核心方法:
    • preHandle():在Controller 方法执行之前执行,返回 true 表示继续执行,返回 false 则中断请求。
    • postHandle():在Controller 方法执行之后、视图渲染之前执行。
    • afterCompletion():在视图渲染完成后执行。
  • WebMvcConfigurer 接口::用于配置Spring MVC 的各种设置,包括注册自定义拦截器。

实现步骤

1. 创建拦截器类
创建一个类,并实现HandlerInterceptor接口。在这个类中重写preHandle()等方法,实现拦截器业务逻辑。

public class ValidateLoginInterceptor implements HandlerInterceptor {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  // 业务代码}
@Override  
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在 Controller 方法执行后,视图渲染前执行的逻辑 System.out.println("postHandle: Controller 方法执行后"); } 
@Override 
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  // 在视图渲染完成后执行的逻辑 System.out.println("afterCompletion: 视图渲染后");}
}

2. 创建配置类,注册拦截器

  • 创建一个配置类,实现WebMvcConfigurer接口,并在配置类上添加@Configuration注解,标记为配置类。
  • 重写 addInterceptors 方法,实例化自定义拦截器,并将其添加到拦截器链中。
/**  * @Author Ryan  * @Date 2025/9/4 17:12  */@Configuration  
public class InterceptorConfigurer implements WebMvcConfigurer {  /**  * 注册权限控制拦截器  */  @Override  public void addInterceptors(InterceptorRegistry registry) {  /**  * 注册登录核验拦截器  */  // addPathPatterns("/api/**") 拦截/api路径下的所有请求registry.addInterceptor(validateLoginInterceptor()).addPathPatterns("/api/**");  }  /***  * 登录核验拦截器  * @return  */  @Bean  // 注册为Bean,让Spring进行管理public ValidateLoginInterceptor validateLoginInterceptor() {  return new ValidateLoginInterceptor();  }  
}

如果通过注解的方式定义拦截器

1. 自定义注解

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)  
@Documented  
public @interface ValidateLogin {  }
  • @Retention:指定被修饰的注解的保留策略(即注解在哪个阶段有效)。

    • SOURCE:注解仅在源代码阶段保留,编译成字节码(.class)后会被丢弃(如 @Override 注解)。
    • CLASS:注解保留到字节码阶段,但运行时(JVM 加载类后)会被丢弃(默认策略)。
    • RUNTIME:注解一直保留到运行时,可以通过反射机制在程序运行时获取注解信息(最常用,如 Spring 的 @Autowired)。
  • @Target:指定被修饰的注解可以应用在哪些元素上(如类、方法、字段)。

    • ElementType 是枚举类,常用值包括:
    • TYPE:可用于类、接口、枚举
    • METHOD:可用于方法
    • FIELD:可用于字段(成员变量)
    • PARAMETER:可用于方法参数
    • CONSTRUCTOR:可用于构造方法
    • 其他(如 ANNOTATION_TYPELOCAL_VARIABLE 等)。
  • @Document:标记被修饰的注解会被Javadoc 工具提取到 API 文档中

    2. 配置自定义注解的相关拦截器

public class ValidateLoginInterceptor implements HandlerInterceptor {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  HandlerMethod handlerMethod = (HandlerMethod) handler;  // 获取拦截到的方法  Method method = handlerMethod.getMethod();  // 获取方法上的ValidateLogin注解  ValidateLogin validateLogin = method.getAnnotation(ValidateLogin.class);  if (validateLogin == null) {  // 未获取到登录鉴权注解,则表示不需要拦截,直接放行  return true;  }  String userId = SessionHelper.getCurrentUserId();  if (StringUtils.isBlank(userId)) {  // 未登录,鉴权失败  throw new AuthException("未登录!");  }  return true;  }  
}

3. 创建配置类,注册拦截器(如上面所写)

使用场景

  • 日志记录:记录请求 URL、参数、处理时间等
  • 权限验证:检查用户是否登录或拥有访问权限
  • 性能监控:记录请求处理时间
  • 字符编码处理:统一设置请求响应编码
  • 异常处理:捕获请求过程中的异常
  • 等等

注意事项

  • 拦截器是 Spring MVC 的组件,依赖于 Spring 容器
  • 拦截器可以访问 Spring 容器中的 Bean,而过滤器(Filter)不能
  • 多个拦截器可以通过order()方法指定执行顺序(值越小越先执行)

文章转载自:

http://60wpQDT7.kpmxn.cn
http://sdqIxhwg.kpmxn.cn
http://GEkWYJ1T.kpmxn.cn
http://ZCFX1uEY.kpmxn.cn
http://2YGxPsgi.kpmxn.cn
http://W21rzFlW.kpmxn.cn
http://j3dCj5Ur.kpmxn.cn
http://LszsLf1w.kpmxn.cn
http://oicC7CDa.kpmxn.cn
http://tq7E0AGD.kpmxn.cn
http://wzzXkaoI.kpmxn.cn
http://T0TsaqFo.kpmxn.cn
http://1ChdRDWT.kpmxn.cn
http://NjfR6isF.kpmxn.cn
http://F3JRB9YQ.kpmxn.cn
http://qfENtBUS.kpmxn.cn
http://c7X75adN.kpmxn.cn
http://Xhe4SIsD.kpmxn.cn
http://s1H3T08n.kpmxn.cn
http://C8ymntii.kpmxn.cn
http://KOwG6vrY.kpmxn.cn
http://YOr2RP98.kpmxn.cn
http://PRRfjJgR.kpmxn.cn
http://YmJ2E1H4.kpmxn.cn
http://r10c2EkO.kpmxn.cn
http://vR6aQowX.kpmxn.cn
http://GDsKmU1U.kpmxn.cn
http://17kda3yC.kpmxn.cn
http://3suF0vNb.kpmxn.cn
http://km4YjDcM.kpmxn.cn
http://www.dtcms.com/a/367034.html

相关文章:

  • 实战复盘:pnpm Monorepo 中的 Nuxt 依赖地狱——Unhead 升级引发的连锁血案
  • 传统装修行业数字化转型:如何通过GEO工具实现300%业绩增长?
  • cursor使用配置
  • Linux内核进程管理子系统有什么第四十二回 —— 进程主结构详解(38)
  • OpenLayers常用控件 -- 章节三:鼠标位置坐标显示控件教程
  • QT6(拖放事件与拖放操作)
  • Java全栈工程师的实战面试:从Vue到Spring Boot的技术旅程
  • 3ds Max流体模拟终极指南:打造逼真液体效果,从瀑布到杯中溢出的饮料!
  • 处理PostgreSQL中的磁盘I/O瓶颈
  • Redission 对比isHeldByCurrentThread()和unlock()
  • 逻辑回归基础
  • 目标检测如何将同时有方形框和旋转框的json/xml标注转为txt格式
  • 拦截器和过滤器(理论+实操)
  • HTML 基本结构
  • 《Html泛型魔法学院:用霍格沃茨风格网页教授集合框架》
  • 【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践
  • 白平衡分块统计数据为什么需要向下采样?
  • 基于单片机智能扫地机器人/智能小车设计
  • 2025 前端 3D 选型指南:Three.js、Babylon.js、WebGPU 深度对比
  • AI视频画质提升效果实用指南:提升清晰度的完整路径
  • Boost搜索引擎 数据清洗与去标签(1)
  • Deeplizard深度学习课程(七)—— 神经网络实验
  • 深度学习——数据增强
  • 在线测评系统---第n天
  • 【nuscenes数据集有关】
  • 你的图片又被别人“白嫖”了?用这篇Java防盗链攻略说再见!
  • python中的import和from两种导入方式有什么区别
  • MyBatis核心技术全解
  • 标注工具labelimg使用简介
  • 用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码