在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` 来实现各种功能。