Filter可以在servlet这个目标程序之前添加代码,也可以在目标程序执行之后添加代码,之前之后都可以添加过滤规则。一般情况下,都是在过滤器中编写公共代码
怎么实现一个过滤器?
第一步:实现Filter接口
编写java类实现一个Filter接口,并且导入javax.servlet.Filter,并实现这个接口的所有方法 3个
init方法:在Filter对象第一次被创建后调用,并且只调用一次
doFilter方法:只要用户发送一次请求,则执行一次,发送N次请求,执行N次,这个方法中编写过滤规则
destroy方法:在Filter对象销毁/释放之前调用,并且只调用一次
第二步:配置Filter路径
1,配置Filter,可以用注解@WebFilter("/....") Filter在配置时,和servlet一样,也可以配置通配符,例如 @WebFilter("*.do")表示拦截所有以.do结尾的请求
2,也可以使用xml文件
<filter>
<filter-name>Demo01Filter</filter-name>
<filter-class>com.filters.Demo01Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Demo01Filter</filter-name>
<url-pattern>/demo01.do</url-pattern>
</filter-mapping>
注意:
Servlet对象默认情况下,在服务器启动的时候是不会新建对象的
Filter对象默认情况下,在服务器启动的时候会新建对象
Servlet对象是单例的,Filter对象也是单例的,(单实例,对象只创建一次)
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/demo01.do")
@WebFilter("*.do")
public class Demo01Filter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("helloA");
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("helloA2");
}
@Override
public void destroy() {
}
}
补充 过滤器链
1)如果采取的是注解的方式进行配置那么过滤器链的拦截顺序是按照全类名的先后顺序排序的
2)如果采取的是xml的方式进行配置,那么按照配置的先后顺序进行排序