1. 引言
1.1 什么是 Spring Filter
Spring Filter 是 Spring 框架中用于处理 HTTP 请求和响应的组件。它允许你在请求到达目标资源之前或响应返回客户端之前执行自定义逻辑。
1.2 Spring Filter 的作用与优势
- 请求预处理:在请求到达目标资源之前进行预处理,如身份验证、日志记录等。
- 响应后处理:在响应返回客户端之前进行后处理,如压缩响应内容、修改响应头等。
- 模块化:将不同的处理逻辑分离到不同的 Filter 中,提高代码的可维护性和可扩展性。
2. 基础概念
2.1 过滤器(Filter)的基本概念
过滤器是一种服务器端技术,用于在请求到达目标资源之前或响应返回客户端之前拦截请求和响应。
2.2 Spring Filter 与 Servlet Filter 的区别
- 集成性:Spring Filter 与 Spring 框架无缝集成,可以使用 Spring 的依赖注入等功能。
- 配置方式:Spring Filter 提供了多种配置方式,如注解、Java 配置类和 XML 配置。
3. Spring Filter 的配置
3.1 使用 @WebFilter
注解配置 Filter
使用 @WebFilter
注解可以方便地配置 Filter。
代码示例
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 请求处理逻辑
System.out.println("LoggingFilter: Request received");
chain.doFilter(request, response);
// 响应处理逻辑
System.out.println("LoggingFilter: Response sent");
}
@Override
public void destroy() {
// 销毁逻辑
}
}
3.2 使用 Java 配置类配置 Filter
使用 Java 配置类可以更灵活地配置 Filter。
代码示例
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<LoggingFilter> loggingFilter() {
FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new LoggingFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
3.3 使用 XML 配置 Filter
使用 XML 配置 Filter 是一种传统的配置方式。
代码示例
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. Spring Filter 的生命周期
4.1 初始化(init)
Filter 的初始化方法 init
在 Filter 被创建后立即调用,用于执行初始化逻辑。
代码示例
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
System.out.println("LoggingFilter initialized");
}
4.2 请求处理(doFilter)
Filter 的 doFilter
方法用于处理请求和响应。
代码示例
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 请求处理逻辑
System.out.println("LoggingFilter: Request received");
chain.doFilter(request, response);
// 响应处理逻辑
System.out.println("LoggingFilter: Response sent");
}
4.3 销毁(destroy)
Filter 的销毁方法 destroy
在 Filter 被销毁前调用,用于执行清理逻辑。
代码示例
@Override
public void destroy() {
// 销毁逻辑
System.out.println("LoggingFilter destroyed");
}
5. 编写自定义 Spring Filter
5.1 实现 Filter
接口
编写自定义 Filter 需要实现 Filter
接口。
代码示例
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 请求处理逻辑
System.out.println("LoggingFilter: Request received");
chain.doFilter(request, response);
// 响应处理逻辑
System.out.println("LoggingFilter: Response sent");
}
@Override
public void destroy() {
// 销毁逻辑
}
}
5.2 示例:日志记录 Filter
日志记录 Filter 可以记录请求和响应的信息。
代码示例
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
@Override
public void doFilter(ServletRequest req