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

spring boot 过滤器简单demo


1. 过滤器(Filter)的概念

过滤器是 Java Web 应用中的一种组件,它可以在请求到达目标资源(如 Controller)之前或响应返回客户端之后,对请求和响应进行统一处理。它的核心作用是对 HTTP 请求和响应进行拦截和增强


2. 过滤器的典型应用场景

在你的用户管理系统中,过滤器的常见用途包括:

场景说明
身份认证拦截未登录用户的请求,强制跳转到登录页面。
日志记录记录请求的 URL、IP、耗时等信息,用于监控和调试。
权限控制验证用户是否有权限访问某些接口(如管理员接口)。
全局字符编码统一设置请求和响应的编码(如 UTF-8)。
防止 XSS/SQL 注入对请求参数进行过滤,防止恶意攻击。

3. 在项目中添加过滤器的步骤

以下是在 Spring Boot 中实现过滤器的两种常用方式:


方式一:使用 @WebFilter 注解(推荐)
3.1 创建过滤器类

在项目中新建 filter 包,并创建 LogFilter 类:

package com.example.spring_demo01.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class LogFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 请求到达 Controller 前的逻辑
        long startTime = System.currentTimeMillis();
        System.out.println("请求开始: " + startTime + "ms");

        // 放行请求,继续执行后续过滤器或 Controller
        chain.doFilter(request, response);

        // 响应返回客户端前的逻辑
        long endTime = System.currentTimeMillis();
        System.out.println("请求结束,耗时: " + (endTime - startTime) + "ms");
    }
}
3.2 启用过滤器扫描

在启动类 SpringDemo01Application 上添加 @ServletComponentScan 注解:

@SpringBootApplication
@ServletComponentScan // 启用 Servlet 组件扫描(如 Filter、Servlet)
public class SpringDemo01Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringDemo01Application.class, args);
    }
}

方式二:通过 FilterRegistrationBean 注册
3.1 创建过滤器类(无需注解)
package com.example.spring_demo01.filter;

import javax.servlet.*;
import java.io.IOException;

public class AuthFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 模拟检查 Token
        String token = request.getParameter("token");
        if (token == null || !token.equals("123456")) {
            response.getWriter().write("请先登录!");
            return;
        }
        chain.doFilter(request, response);
    }
}
3.2 注册过滤器到 Spring 容器

新建配置类 FilterConfig

package com.example.spring_demo01.config;

import com.example.spring_demo01.filter.AuthFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    
    @Bean
    public FilterRegistrationBean<AuthFilter> authFilter() {
        FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new AuthFilter());
        registration.addUrlPatterns("/user/*"); // 仅拦截用户相关接口
        registration.setOrder(1); // 设置执行顺序(值越小优先级越高)
        return registration;
    }
}

4. 测试过滤器的效果

4.1 测试日志过滤器

发送任意请求(如 GET /user/list),观察控制台输出:

请求开始: 1721042400000ms
请求结束,耗时: 15ms
4.2 测试权限过滤器

访问需要 Token 的接口(如 GET /user/1):

  • 不带 Token:返回 请先登录!
  • 带正确 TokenGET /user/1?token=123456 → 正常返回用户数据

5. 过滤器的核心注意事项

  1. 执行顺序
    通过 setOrder() 控制多个过滤器的执行顺序(值越小越先执行)。

  2. 性能影响
    避免在过滤器中执行耗时操作(如远程调用),否则会拖慢接口响应速度。

  3. 静态资源拦截
    若不想拦截静态资源(如 CSS/JS),可调整 urlPatterns

    @WebFilter(urlPatterns = {"/api/*", "/admin/*"}) // 仅拦截 API 和管理端接口
    
  4. 排除特定路径
    Spring Boot 中可通过 FilterRegistrationBean 排除路径:

    registration.addInitParameter("exclusions", "/login,/static/*");
    

6. 完整项目结构参考

src/
├── main/
│   ├── java/
│   │   └── com/example/spring_demo01/
│   │       ├── SpringDemo01Application.java
│   │       ├── config/
│   │       │   ├── FilterConfig.java       // 过滤器配置
│   │       │   └── MyBatisPlusConfig.java
│   │       ├── controller/
│   │       ├── entity/
│   │       ├── filter/                     // 存放过滤器
│   │       │   ├── LogFilter.java
│   │       │   └── AuthFilter.java
│   │       ├── mapper/
│   │       └── service/
│   └── resources/
└── test/

通过添加过滤器,你可以轻松实现统一的权限控制、日志记录等功能,无需在每个 Controller 中重复编写相同逻辑。

http://www.dtcms.com/a/76297.html

相关文章:

  • Java实现字符串大写字母转小写的多种方法及优化策略
  • Web Component 教程(三):生命周期方法的触发时机与实际应用
  • 【C++】树和二叉树的实现(下)
  • 数据库:一文掌握 MongoDB 的各种指令(MongoDB指令备忘)
  • uniapp常用组件
  • 在 Vue.js 中使用递归组件:轻松处理嵌套数据结构
  • Python 爬虫(2)Web请求
  • 第六章-PHP错误处理
  • Hexo博客部署免费Twikoo评论系统新手教程
  • SAP的WPS导出找不到路径怎么办;上载报错怎么办
  • JavaScript 日期区间计算:全面解析与实战应用
  • 埃森哲XX行业信息化整体规划方案P117(117页PPT)(文末有下载方式)
  • k8s学习记录(三):Pod基础-Node选择
  • 联想扬天M590台式机开机卡LOGO不引导故障维修案例分享
  • RabbitMQ 入门
  • 本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)
  • vue3:九、路由守卫
  • Hive Presto SQL 查询优化指南
  • 飞腾2000+/64核加固服务器
  • 【c++】c++语言中““符号的用途介绍
  • 【零基础入门unity游戏开发 —— 通用篇】层级(Layer)、层级编号、层级二进制掩码和unity层级检测原理
  • 【蓝桥杯速成】| 6.背包问题(01版)
  • Nuxt2 vue 给特定的页面 body 设置 background 不影响其他页面
  • 知识管理流程指南
  • Python----计算机视觉处理(Opencv:形态学变换)
  • Bellman_ford 算法--带负权值的单源最短路问题,边列表存储
  • 相机标定之DLT算法学习
  • [HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议
  • Java高级编程深度解析:JVM底层原理、设计模式与Java 8+新特性实战
  • 案例驱动的 IT 团队管理:创新与突破之路:第三章 项目攻坚:从流程优化到敏捷破局-3.2.1案例:传统企业敏捷转型的“阵痛期“应对