目录
[二、SpringBoot 添加过滤器](#二、SpringBoot 添加过滤器)
一、过滤器详解
过滤器(Filter)是 Java Web 应用中的一种重要组件,用于对请求和响应进行拦截和处理。它可以用于执行各种任务,如请求预处理、请求和响应的转换、授权检查、日志记录、字符编码处理等。在 Java Web 开发中,过滤器通常用于全局性的操作,以确保在进入和离开 Web 应用程序时执行相同的逻辑。
-
过滤器接口: 在 Java Servlet 规范中,过滤器是一个实现了
javax.servlet.Filter
接口的类。该接口定义了三个主要方法:init(FilterConfig filterConfig)
: 在过滤器被初始化时调用,通常用于执行一次性的初始化工作。doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
: 在请求进入过滤器时调用,可对请求和响应进行处理,然后将请求传递给下一个过滤器或目标 Servlet。destroy()
: 在过滤器被销毁时调用,通常用于清理资源。
-
过滤器链(Filter Chain): 多个过滤器可以按照配置的顺序形成一个过滤器链。每个过滤器都可以选择在请求被传递给下一个过滤器之前或之后执行逻辑。过滤器链通常由 Servlet 容器(如 Tomcat 或 Jetty)维护。
-
过滤器配置: 过滤器可以通过配置在
web.xml
文件中或使用 Servlet 3.0+ 注解进行配置。在web.xml
中配置的过滤器称为部署描述符配置的过滤器,而使用注解配置的过滤器称为编程式配置的过滤器。 -
过滤器的应用场景: 过滤器可以用于各种应用场景,包括但不限于:
- 认证和授权:检查用户是否已登录,是否有权限访问某个资源。
- 请求和响应日志记录:记录请求和响应的详细信息,用于调试和监控。
- 字符编码处理:确保请求和响应中的字符编码正确。
- 输入数据校验和清理:验证和清理用户输入数据,防止安全漏洞(如 XSS 攻击)。
- 图像、视频或其他多媒体转换:将请求中的媒体内容转换为不同的格式。
- 请求重定向:根据某些条件将请求重定向到不同的目标。
- 缓存控制:管理浏览器缓存策略。
-
过滤器的执行顺序: 过滤器的执行顺序由它们在
web.xml
或注解中的声明顺序决定。首先执行部署描述符中声明的过滤器,然后按照编程式配置的顺序执行过滤器。 -
过滤器的异常处理: 过滤器可以捕获并处理异常,然后选择将请求传递给下一个过滤器或中断请求的处理流程。通常,过滤器可以使用
HttpServletResponse
来发送错误响应。 -
过滤器的生命周期: 过滤器的生命周期由 Servlet 容器管理。容器在启动时初始化过滤器,之后每次请求都会创建新的过滤器实例,并在请求处理完毕后销毁它。
二、SpringBoot 添加过滤器
在 Spring Boot 中添加过滤器(Filter)是通过实现 javax.servlet.Filter
接口并将其注册到应用程序中的方法来实现的。过滤器可以用于对请求和响应进行预处理或后处理,通常用于执行一些与请求/响应相关的操作,例如日志记录、授权检查、字符编码处理等。
-
创建过滤器类: 首先,您需要创建一个类,实现
javax.servlet.Filter
接口,并实现doFilter
方法来定义过滤器的逻辑。以下是一个简单的示例:javaimport 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 MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化方法 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在请求处理前执行的逻辑 // 您可以在这里执行任何与请求相关的操作 // 例如,日志记录、授权检查、字符编码处理等 // 继续执行过滤器链 chain.doFilter(request, response); // 在请求处理后执行的逻辑 // 您可以在这里执行任何与响应相关的操作 } @Override public void destroy() { // 销毁方法 } }
-
配置过滤器: 在 Spring Boot 中,您可以通过
FilterRegistrationBean
类来配置和注册自定义过滤器。通常,您需要在 Spring Boot 的配置类中进行配置。以下是一个示例:javaimport org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyFilterConfig { @Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyFilter()); registrationBean.addUrlPatterns("/api/*"); // 配置过滤的 URL return registrationBean; } }
在上面的示例中,我们创建了一个
FilterRegistrationBean
并将自定义的MyFilter
实例设置为过滤器。然后,使用addUrlPatterns
方法指定要过滤的 URL 模式。 -
配置 URL 模式: 在
addUrlPatterns
方法中,您可以指定要过滤的 URL 模式。在上述示例中,所有以 "/api/" 开头的请求都将被MyFilter
过滤。 -
其他配置: 您可以根据需要添加其他配置,例如过滤器的顺序、过滤器名称等。
-
运行应用程序: 确保您的 Spring Boot 应用程序处于运行状态,过滤器将会拦截匹配的请求。
这样,就将自定义过滤器添加到了 Spring Boot 应用程序中。过滤器将按照配置的顺序对请求进行处理。