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

Java Spring 之拦截器HandlerInterceptor详解与实战

目录

    • 一、拦截器的作用
      • 1.1 请求处理前的拦截
      • 1.2 请求处理后的拦截
      • 1.3 请求完成后的拦截
    • 二、创建拦截器
      • 2.1 实现 `HandlerInterceptor` 接口
      • 2.2 注册拦截器
    • 三、拦截器的使用场景
      • 3.1 权限校验
      • 3.2 日志记录
      • 3.3 性能监控
    • 四、总结

在 Spring 框架中,拦截器( HandlerInterceptor)是一种强大的机制,用于在请求处理之前、之后以及请求完成之后执行代码。拦截器可以用于实现诸如权限校验、日志记录、性能监控等功能。本文将详细介绍 Spring 拦截器的使用方法,并提供具体的代码示例。

一、拦截器的作用

1.1 请求处理前的拦截

在请求到达控制器方法之前,拦截器可以执行一些前置操作,例如校验用户是否登录、记录请求时间等。

1.2 请求处理后的拦截

在控制器方法执行完毕后,拦截器可以执行一些后置操作,例如修改响应内容、记录处理时间等。

1.3 请求完成后的拦截

在请求完全处理完毕后,拦截器可以执行一些清理操作,例如释放资源、记录日志等。

二、创建拦截器

2.1 实现 HandlerInterceptor 接口

创建一个类实现 HandlerInterceptor 接口,并重写其方法。

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {// 在请求处理之前执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle: 请求处理之前");// 返回 true 表示继续执行后续的拦截器或控制器方法,返回 false 表示中断执行return true;}// 在请求处理之后执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle: 请求处理之后");}// 在请求完成之后执行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion: 请求完成之后");}
}

2.2 注册拦截器

在 Spring 配置中注册创建的拦截器。

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 {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**") // 指定拦截的路径.excludePathPatterns("/static/**", "/error"); // 指定不拦截的路径}
}

三、拦截器的使用场景

3.1 权限校验

在用户请求到达控制器之前,校验用户是否有权限访问该资源。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Object user = request.getSession().getAttribute("user");if (user == null) {// 如果用户未登录,重定向到登录页面response.sendRedirect(request.getContextPath() + "/login");return false;}return true;
}

3.2 日志记录

记录请求的详细信息,包括请求时间、请求路径、响应时间等。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);return true;
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();System.out.println("请求路径:" + request.getRequestURI() + ",处理时间:" + (endTime - startTime) + "ms");
}

3.3 性能监控

对请求的处理时间进行监控,分析系统的性能瓶颈。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);return true;
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();long responseTime = endTime - startTime;System.out.println("请求路径:" + request.getRequestURI() + ",响应时间:" + responseTime + "ms");// 根据响应时间进行性能分析和警告
}

四、总结

通过实现 HandlerInterceptor 接口并重写其方法,我们可以创建自定义的拦截器。然后在 Spring 配置中注册拦截器并指定其拦截路径,就可以在请求的各个阶段执行自定义逻辑。拦截器在权限校验、日志记录、性能监控等场景中有着广泛的应用。希望本文的示例和讲解能够帮助你更好地理解和使用 Spring 拦截器。

http://www.xdnf.cn/news/727381.html

相关文章:

  • Ts中的 可选链操作符
  • Apache SeaTunnel部署技术详解:模式选择、技巧与最佳实践
  • Photoshop使用钢笔绘制图形
  • 一种通用图片红色印章去除的工具设计
  • 【OpenHarmony】【交叉编译】使用gn在Linux编译3568a上运行的可执行程序
  • pikachu通关教程-CSRF XSS
  • 人脸口罩识别
  • NewsNow:免费好用的实时新闻聚合平台,让信息获取更优雅(深度解析、部署攻略)
  • 在Babylon.js中创建3D文字:简单而强大的方法
  • 【计算机网络】应用层协议Http——构建Http服务服务器
  • 最佳实践|互联网行业软件供应链安全建设的SCA纵深实践方案
  • 移动安全Android——客户端静态安全
  • 安卓逆向篇Smail 语法反编译签名重打包Activity 周期Hook 模块
  • 【仿生机器人】极具前瞻性的架构——认知-情感-记忆“三位一体的仿生机器人系统架构
  • HTML5 列表、表格与媒体元素、页面结构分析
  • 基于Java(SSH框架)+MySQL 实现(Web)公司通用门户(CMS)网站
  • 鸿蒙OSUniApp滑动锁屏实战:打造流畅优雅的移动端解锁体验#三方框架 #Uniapp
  • Spring Boot深度解析:自动配置、Starter依赖与MyBatis Plus集成指南
  • MathWorks无法注册,显示no healthy upstream(已解决)
  • Linux的调试器--gbd/cgbd
  • Java基础知识总结继承与多态详解
  • TestHubo V1.1.0版本发布,新增用例评审功能,确保测试用例质量,提升测试用例覆盖率
  • AI生态警报:MCP协议风险与应对指南(上)——架构与供应链风险
  • 数字化那点事系列文章
  • ISCC-2025-web-wp
  • Linux详谈进程地址空间
  • 西蒙诺维奇-炮弹导体粗糙度模型揭秘
  • 智能问数技术路径对比:NL2SQL vs NL2Semantic2SQL
  • 更新密码--二阶注入攻击的原理
  • 【Linux】环境变量完全解析