JAVA EE 过滤器
在 Spring Boot 中,使用过滤器(Filter)可以让你在请求和响应处理流程中插入自定义逻辑。过滤器在 Spring Boot 中通常用于处理跨域请求、记录请求日志、进行身份验证、请求参数处理等。
下面是如何在 Spring Boot 中使用过滤器的步骤和示例。
1. 创建一个自定义过滤器
一个过滤器需要实现 javax.servlet.Filter 接口,并重写 doFilter() 方法。
示例代码:
package com.example.demo.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;
import org.springframework.stereotype.Component;
@Component
public class MyCustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化(可选)
System.out.println("MyCustomFilter initialized!");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器的核心逻辑
System.out.println("Request is being filtered...");
// 执行请求的下一步(即传递给下一个过滤器或目标资源)
chain.doFilter(request, response);
// 响应返回时的处理
System.out.println("Response is being filtered...");
}
@Override
public void destroy() {
// 过滤器销毁(可选)
System.out.println("MyCustomFilter destroyed!");
}
}
说明:
init()方法:在过滤器初始化时调用(可选)。doFilter()方法:处理过滤器的核心逻辑,可以在此处进行请求的预处理,或者响应的后处理。chain.doFilter()调用将请求传递到下一个过滤器或目标资源。destroy()方法:过滤器销毁时调用(可选)。
2. 注册过滤器
Spring Boot 自动扫描所有标注为 @Component 的类,因此如果你的过滤器类加上了 @Component 注解,它会被自动注册为 Spring Bean,并被应用到整个应用程序中。@Component 可以省略,下面的方式也能注册。
通过 FilterRegistrationBean 显式注册过滤器(更灵活)
如果你想控制过滤器的顺序或仅对某些 URL 路径生效,可以通过 FilterRegistrationBean 来显式注册过滤器。
package com.example.demo.config;
import com.example.demo.filter.MyCustomFilter;
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<MyCustomFilter> loggingFilter() {
FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyCustomFilter());
registrationBean.addUrlPatterns("/api/*"); // 仅对 /api/* 路径的请求生效
registrationBean.setOrder(1); // 设置过滤器的执行顺序,数字越小,优先级越高
return registrationBean;
}
}
配置说明:
setFilter():指定要注册的过滤器。addUrlPatterns():指定过滤器要应用的 URL 路径(支持通配符)。setOrder():设置过滤器的执行顺序。顺序较小的过滤器优先执行,顺序较大的过滤器后执行。
3. 实现跨域请求处理(CORS)
package com.example.demo.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;
import org.springframework.stereotype.Component;
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化过滤器
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置CORS头信息
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");
// 继续执行请求
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁时的逻辑
}
}

浙公网安备 33010602011771号