目录
一 Filter 简介
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
二.Filter创建
- 创建一个类实现Filter接口
- 重写接口中方法 doFilter方法是真正过滤的
- 在web.xml文件中配置
注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)那么资源是不会被访问到的。
public class FirstFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
String remoteAddr=request.getRemoteAddr();
String url=request.getRequestURL().toString();
System.out.println(LocalDateTime.now() +" "+remoteAddr+" "+url);
//放行,执行下一个过滤器
filterChain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("在 tomcat 服务器启动的时候filter 就会初始化");
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.joe.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三.FilterChain
FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
- 问题:怎样可以形成一个Filter链?
只要多个Filter对同一个资源进行拦截就可以形成Filter链,例如:/*
<!--web.xml 配置-->
<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.joe.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
//例如都配置对/*访问的拦截
<url-pattern>/*</url-pattern>
</filter-mapping>
- 问题:怎样确定Filter的执行顺序?
由<filter-mapping>来确定,在web.xml文件中哪一个过滤器的<filter-mapping>放到了前面谁就先执行。
四.FilterConfig
在Filter的init方法上有一个参数,类型就是FilterConfig.
FilterConfig它是Filter的配置对象,它可以完成下列功能
- 获取Filtr名称
- 获取Filter初始化参数
- 获取ServletContext对象。
怎么获取到一个filterConfig对象
fiterConfig中的方法
public class FirstFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
String remoteAddr=request.getRemoteAddr();
String url=request.getRequestURL().toString();
System.out.println(LocalDateTime.now() +" "+remoteAddr+" "+url);
String filterName=filterConfig.getFilterName();
System.out.println("过滤器名称:"+filterName);
ServletContext servletContext=filterConfig.getServletContext();
System.out.println("servletContext:"+servletContext);
Enumeration<String> names=filterConfig.getInitParameterNames();
while (names.hasMoreElements()){
System.out.println(names.nextElement());
}
String encoding=filterConfig.getInitParameter("encoding");
System.out.println("初始化编码为:"+encoding);
filterChain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("在 tomcat 服务器启动的时候filter 就会初始化");
this.filterConfig=filterConfig;
}
@Override
public void destroy() {
}
}
<!--web.xml 配置-->
<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.joe.filter.FirstFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
五.Filter 生命周期
Filter生命周期:
实例化 --》 初始化 --》 服务 --》 销毁
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.