[Q&A] 什么是GenericFilterBean
?
GenericFilterBean
是 SpringWeb
框架中提供的一个抽象基类,其对 javax.servlet.Filter
接口进行了封装和扩展,它简化了在 Servlet
环境下创建自定义过滤器的工作。
[Q&A] GenericFilterBean
有啥特点?
集成 Spring 容器: 由于它是一个 Spring Bean,因此可以方便地利用 Spring 的依赖注入(DI)特性来管理其他服务和资源。
生命周期管理: 通过实现 InitializingBean
和 DisposableBean
接口,提供了自动化的初始化 (afterPropertiesSet()
) 和销毁 (destroy()
) 生命周期方法,使得在 Filter
启动时能正确初始化,在应用关闭时能释放资源。
环境感知: 通过实现 EnvironmentAware
和 ServletContextAware
接口,Filter
能够获取到运行时环境变量和 Servlet
上下文信息。
开发人员只需关注业务过滤逻辑的实现,即可轻松地将自定义的过滤功能整合到基于 Spring 的 Web 应用程序中。
使用样例:
//@Component 注册时会new 这里无需指定 registration.setFilter(new RequestCheckFilter());
public class RequestCheckFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("***RequestHeaderCheckFilter.doFilter.start***");
if (!(request instanceof HttpServletRequest)) {
throw new IllegalStateException("Expected HttpServletRequest");
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
FilterHttpServletRequest filterHttpRequest = new FilterHttpServletRequest(httpRequest);
String body = filterHttpRequest.getBody();
filterHttpRequest.setAttribute("requestBodyData", body);
// 继续执行filter链
chain.doFilter(filterHttpRequest, response);
System.err.println("***RequestHeaderCheckFilter.doFilter.end***");
}
}
// 注册过滤器
@Configuration
public class AppConfig {
@Bean
public FilterRegistrationBean<RequestCheckFilter> requestCheckFilterRegistration() {
FilterRegistrationBean<RequestCheckFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new RequestCheckFilter());
// 可以设置过滤器名称
registration.setName("requestCheckFilter");
// 设置拦截规则
registration.addUrlPatterns("/*"); // 拦截所有请求
// 设置过滤器执行顺序,默认为0,数值越小优先级越高
registration.setOrder(2);
return registration;
}
}