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

springmvc中,Filter使用

在Spring框架中,`Filter` 是一个非常有用的组件,用于在请求到达Controller之前或响应返回客户端之前执行一些逻辑。`Filter` 可以用于日志记录、权限验证、请求修改等多种场景。

### **1. 创建自定义 `Filter`**

要使用Spring的 `Filter`,首先需要创建一个类并实现 `javax.servlet.Filter` 接口。以下是一个简单的自定义 `Filter` 示例:

```java
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class CustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化时执行的代码
        System.out.println("CustomFilter initialized");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 在请求到达Controller之前执行的代码
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("Request URL: " + httpRequest.getRequestURL());

        // 执行后续的过滤器或Controller
        chain.doFilter(request, response);

        // 在响应返回客户端之前执行的代码
        System.out.println("Response processed");
    }

    @Override
    public void destroy() {
        // 销毁时执行的代码
        System.out.println("CustomFilter destroyed");
    }
}
```

### **2. 注册 `Filter`**

在Spring Boot项目中,可以通过多种方式注册 `Filter`:

#### **方式一:使用 `@Bean` 注册**
在Spring配置类或启动类中,使用 `@Bean` 注册 `Filter`:

```java
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<CustomFilter> customFilter() {
        FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/api/*"); // 指定过滤器的URL模式
        return registrationBean;
    }
}
```

#### **方式二:实现 `FilterRegistrationBean`**
直接在配置类中定义 `FilterRegistrationBean`:

```java
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<CustomFilter> customFilter() {
        FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/api/*");
        return registrationBean;
    }
}
```

#### **方式三:使用 `@WebFilter` 注解(Servlet 3.0+)**
如果你的项目支持Servlet 3.0及以上版本,可以直接在 `Filter` 类上使用 `@WebFilter` 注解:

```java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = "/api/*")
public class CustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CustomFilter initialized");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("Request URL: " + httpRequest.getRequestURL());
        chain.doFilter(request, response);
        System.out.println("Response processed");
    }

    @Override
    public void destroy() {
        System.out.println("CustomFilter destroyed");
    }
}
```

### **3. 测试 `Filter`**

启动Spring Boot应用后,访问 `/api/*` 路径下的任何接口,`CustomFilter` 都会拦截请求并打印日志。

### **4. 使用场景**
- **日志记录**:记录请求的URL、参数、响应时间等。
- **权限验证**:检查用户是否登录,是否有权限访问某个资源。
- **请求修改**:修改请求头或请求体。
- **响应修改**:修改响应头或响应体。

通过以上方法,你可以轻松地在Spring项目中使用 `Filter` 来实现各种功能。

相关文章:

  • 探秘Transformer系列之(16)--- 资源占用
  • 如何在Spring Boot中设置HttpOnly Cookie以增强安全性
  • eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true
  • WEB攻防- PHP反序列化属性权限特征原生类 TIPS字符串逃逸CVE 绕过漏洞
  • PostgreSQL_数据回退,数据库导出、导入
  • UI自动化测试往往在功能测试之后进行的核心原因
  • 前端技巧第九期JavaScript数据类型
  • 博客图床 VsCode + PicGo + 阿里云OSS,小丑,Github
  • git 设置保存密码 git保存密码
  • 【日志库】—— log4cpp 部署套路
  • [极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)
  • 传感器研习社:Swift Navigation与意法半导体(STMicroelectronics)合作 共同推出端到端GNSS汽车自动驾驶解决方案
  • IM项目 ----- 项目部署
  • SZU软件工程大学生涯 2022~2026
  • 语言大模型之BERT
  • Java 大视界 -- Java 大数据中的知识图谱可视化与交互分析技术(141)
  • 数据库面试题一
  • 开箱即用:免费的数据库管理平台 NineData 社区版
  • 安装和部署Tomcat并在idea创建web文件
  • 在linux服务器部署Heygem
  • 马上评|这种“维权”已经不算薅羊毛,涉嫌犯罪了
  • 西班牙政府排除因国家电网遭攻击导致大停电的可能
  • 加强战略矿产出口全链条管控将重点开展哪些工作?商务部答问
  • 以军向也门3个港口的居民发布撤离令
  • 陕西河南山西等地将现“干热风”灾害,小麦产区如何防范?
  • 李强会见巴西总统卢拉