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

Java Spring 之过滤器(Filter)详解与实战

目录

    • 一、过滤器的作用
      • 1.1 请求处理前的过滤
      • 1.2 请求处理后的过滤
      • 1.3 静态资源处理
    • 二、创建过滤器
      • 2.1 实现 `Filter` 接口
      • 2.2 注册过滤器
    • 三、过滤器的使用场景
      • 3.1 权限校验
      • 3.2 日志记录
      • 3.3 静态资源处理
    • 四、总结

在 Spring 框架中,过滤器(Filter)是一种强大的工具,用于在请求到达 Spring MVC 控制器之前或之后执行特定的逻辑。过滤器可以用于实现诸如日志记录、权限校验、静态资源处理等功能。本文将详细介绍 Spring 过滤器的使用方法,并提供具体的代码示例。

一、过滤器的作用

1.1 请求处理前的过滤

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

1.2 请求处理后的过滤

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

1.3 静态资源处理

过滤器可以用于处理静态资源,例如图片、CSS 文件、JavaScript 文件等,以提高性能和效率。

二、创建过滤器

2.1 实现 Filter 接口

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

import javax.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {// 过滤器初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("MyFilter 初始化");}// 在请求处理之前执行@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("MyFilter: 请求处理之前");// 执行后续的过滤器或控制器方法chain.doFilter(request, response);System.out.println("MyFilter: 请求处理之后");}// 过滤器销毁@Overridepublic void destroy() {System.out.println("MyFilter 销毁");}
}

2.2 注册过滤器

在 Spring 配置中注册创建的过滤器。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilterRegistrationBean() {FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/*"); // 指定过滤的 URL 模式return registrationBean;}
}

三、过滤器的使用场景

3.1 权限校验

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

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;Object user = httpRequest.getSession().getAttribute("user");if (user == null) {// 如果用户未登录,重定向到登录页面httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");return;}chain.doFilter(request, response);
}

3.2 日志记录

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

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {long startTime = System.currentTimeMillis();HttpServletRequest httpRequest = (HttpServletRequest) request;System.out.println("请求路径:" + httpRequest.getRequestURI() + ",请求时间:" + startTime);chain.doFilter(request, response);long endTime = System.currentTimeMillis();System.out.println("请求路径:" + httpRequest.getRequestURI() + ",响应时间:" + endTime + ",处理时间:" + (endTime - startTime) + "ms");
}

3.3 静态资源处理

对静态资源的请求进行处理,例如设置缓存头、压缩响应内容等。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;String requestUri = httpRequest.getRequestURI();if (requestUri.endsWith(".js") || requestUri.endsWith(".css") || requestUri.endsWith(".jpg") || requestUri.endsWith(".png")) {// 设置缓存头,告诉浏览器缓存该资源httpResponse.setHeader("Cache-Control", "max-age=3600");}chain.doFilter(request, response);
}

四、总结

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

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

相关文章:

  • Correlations氛围测试:文本或图像的相似度热图
  • 2024年ESWA SCI1区TOP,自适应学习灰狼算法ALGWO+无线传感器网络覆盖优化,深度解析+性能实测
  • DeepSeek 赋能数字孪生城市,筑牢应急管理智慧防线
  • day42 简单CNN
  • C++ list数据删除、list数据访问、list反转链表、list数据排序
  • HCIE-STP复习
  • C# 密封类和密封方法
  • simulink mask、sfunction和tlc的联动、接口
  • CSS专题之层叠上下文
  • 小明的Java面试奇遇之:支付平台高并发交易系统设计与优化[特殊字符]
  • [SC]SystemC在CPU/GPU验证中的应用(三)
  • 【2025年软考中级】第二章 2.1 程序设计语言的基本概念
  • 【C语言】讲解 程序分配的区域(新手)
  • 论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction
  • C#数字图像处理(一)
  • 【Hot 100】55. 跳跃游戏
  • Unity3D仿星露谷物语开发57之保存库存信息到文件
  • ROS2与Unitree机器人集成指南
  • Linux 基础IO(上)
  • javaweb-maven以及http协议
  • (LeetCode 每日一题) 909. 蛇梯棋 (广度优先搜索bfs)
  • 电子电器架构 --- OTA测试用例分析(上)
  • 华为OD机试_2025 B卷_小明减肥(Python,100分)(附详细解题思路)
  • 最卸载器——Geek Uninstaller 使用指南
  • 设备健康管理的战略升维:用预测性维护重构企业竞争力
  • JDK21深度解密 Day 9:响应式编程模型重构
  • 性能优化 - 理论篇:CPU、内存、I/O诊断手段
  • 性能优化 - 理论篇:常见指标及切入点
  • 钉钉红包性能优化之路
  • Git入门到精通:30分钟掌握核心技巧