过滤器Filter是出于客户端与服务器资源文件之间的一道过滤网。web开发人员通过Filter技术管理web服务器的所有资源,如jsp、servlet、静态图片文件或静态html文件等进行拦截,从而实现一些功能。如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
【注意】javax.servlet.Filter原生过滤器SpringBoot对其再次封装。
1、Filter接口源码说明
package javax.servlet;
import java.io.IOException;
public interface Filter {
//过滤器初始化,init方法只会执行一次
public void init(FilterConfig filterConfig) throws ServletException;
//执行过滤器
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
//过滤器销毁
public void destroy();
}
Filter的创建和销毁由Web服务器负责。Web应用程序启动时,Web服务器将创建Filter的实例对象,并调用其init()方法,读取web.xml配置,完成对象的初始化功能,从而为后续用户请求做好拦截的准备工作(Filter对象只会创建一次,init方法只会执行一次)。开发者通过init方法的参数可获得代表当前filter配置信息的FilterConfig 对象。
当客户请求访问与过滤器关联的URL时,过滤器先将执行doFilter方法。FilterChain参数用于访问后续过滤器。Filter对象创建后会驻留内存中,当web应用移除或服务器停止时才销毁。在Web容器卸载Filter对象之前,destroy被调用。该方法在Filter的生命周期中仅执行一次,destroy方法可以释放过滤器使用的资源。
Filter可以有很多个,一个个Filter组合起来就形成了一个FilterChain过滤器链。FilterChain过滤器链的执行顺序遵循先进后出的原则:当web客户端发送一个Request请求时,这个Request请求会经过FilterChain,由它利用dofilter()方法调用各个子Filter,至于子filter的执行顺序如何,则看客户端如何制定规则的。
2、Filter过滤器应用
【实现Filter接口】注意@WebFilter
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "",urlPatterns = "/*")
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("---------UserFilter初始化----------->>");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("---------UserFilter执行过滤操作----------->>");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("---------UserFilter销毁----------->>");
}
}
【启动类配置@ServletComponentScan】
@SpringBootApplication
@ServletComponentScan
public class ShApp
{
protected final static Logger logger = LoggerFactory.getLogger(ShApp.class);
public static void main(String[] args) {
ApplicationContext ctx =SpringApplication.run(ShApp.class, args);
}
}
3、过滤器中注解@WebFilter/@ServletCompnentScan
【@WebFilter注解】
@WebFilter注解:用于将一个类声明为过滤器,@WebFilter注解将会应用部署时被容器处理,容器根据具体的属性将相应的类部署为过滤器。在Web应用中使用监听器时,不需要在web.xml文件中配置监听器的相关描述信息。@WebFilter注解注解的属性有filterName、urlPatterns、value等。
(1)filterName属性用指定过滤器的name,等价于<filter-name>标签;
(2)urlPatterns属性用于指定一组过滤器的URL匹配模式,等价于xml配置文件中的<url-patten>标签;
(3)value属性等价于urlPatterns属性,不可与urlPatterns属性同时使用。
【@ServletCompnentScan注解】
@ServletCompnentScan注解,使用该注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,不需要其他代码。