Filter的说明
过滤器Filter是对目标资源的请求和响应进行拦截,对拦截到的请求和响应做出特殊的功能处理,如用统一处理请求权限,日志记录,敏感信息屏蔽,参数校验等。
Filter的原理
Java过滤器是JavaWeb的三大组件(Filter,Servlet,Listener)之一,Java Servlet API中提供了Filter接口,编写Filter的实现类,从而实现自定义过滤器。Filter的请求流程为:
1 客户端发起请求
2 服务容器判断当前请求资源是否有过滤器,有则执行过滤器
3 过滤器过滤通过后请求到Servlet服务器
4 返回结果通过过滤器返回给请求方
Filter生命周期
看下Filter接口源码
public interface Filter {
void init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
void destroy();
}
在程序启动时,创建Filter对象,并调用init方法完成Filter初始化,并交由容器管理,常驻内存,在请求发起时,调用doFilter启动对Servlet拦截,过滤通;在程序关闭时调用destroy方法,释放资源,销毁Filter。
Springboot Filter实现
Springboot有两种自定义过滤器的方式
1 @WebFilter和@ServletComponentScan组合使用
如下自定义一个过滤器:
@WebFilter(filterName = "requestFilter")
public class RequestFilter implements Filter {
/**
* 实现doFilter方法,
* 过滤的具体功能在此处处理
*
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if ((servletRequest).getParameter("OK").equalsIgnoreCase("true")) {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
在Springboot启动器中添加@ServletComponentScan即可实现过滤器功能:
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如果需要添加多个过滤器,只需添加多个实现FIlter功能的过滤器。但是这种方式过滤器过滤顺序只能根据过滤器名的类名顺序执行,添加@Order注解是无效的,原因是@WebFilter在容器加载时,不会使用@Order注解定义的顺序,而是默认直接使用类名排序。所以使用这种方式实现多个过滤器,且有顺序要求,则需要注意类名的定义。
2 实现Filter,通过自定义配置类配置Filter
实现Filter与上面RequestFilter相同,只是不添加@WebFilter,同时启动器也不添加@ServletComponentScan,自定义配置类方式如下:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Resource
private RequestFilter requestFilter;
@Bean
public FilterRegistrationBean requestFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(requestFilter);
registration.setName("requestFilter");
registration.setOrder(1);
return registration;
}
}
如果要实现多个过滤器,同时保持自定义顺序,只需对配置文件注册过滤器中的Order改变顺序。注册多个过滤器,只需要在配置类中创建多个Bean。