Filter过滤器

1. 引言

Filter是过滤Request请求的对象,在用户的请求访问资源前处理ServletRequest以及ServletResponse,他可用于日志记录、加解密、Session检查、图像文件保护等。Filter配置可以通过注解或者部署描述来完成,当需要多个Filter配合并强调顺序时只能通过部署描述符配置。

2. Filter API

Filter相关接口包括Filter、FilterConfig、FilterChain,Filter实现必须继承javax.servlet.Filter接口。

2.1 Filter接口

包含三个生命周期init、doFilter、destroy,servlet容器初始化Filter时,会触发Filter的init方法,FilterConfig实例由Servlet容器传入init方法中。

void init(FilterConfig filterConfig)

Servlet容器每次处理Filter相关资源时,会调用相关Filter实例的doFilter方法

void doFilter(ServletRequest request, Servlet Response, FilterChanin filterChain)

在Filter的doFilter的实现中,最后一行需要调用FilterChain中的doFilter方法

filterChain.doFilter(ServletRequest request, ServletResponse response)

一个资源可能被多个Filter关联到(Filter链条),这时Filter.doFilter()方法将触发Filter链条中下一个Filter。只有在Filter链条中的最后一个Filter里调用FilterChain.doFilter()才会触发处理资源方法,否则Request请求终止。 FilterChain接口只定义了一个方法doFilter用于Filter链条

public interface FilterChain {
	
	/**
	* Causes the next filter in the chain to be invoked, or if the calling filter is the last filter
	* in the chain, causes the resource at the end of the chain to be invoked.
	*
	* @param request the request to pass along the chain.
	* @param response the response to pass along the chain.
	*/
	
    public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;

}

Filter接口最后一个方法是destroy,在servlet容器要销毁Filter时触发

void destroy();

3. Filter配置

Filter配置需要如下步骤:

  1. 确认哪些资源需要使用这个Filter拦截器
  2. 配置Filter的初始化参数值
  3. 给Filter取一个名称,方便识别

FilterConfig接口允许通过他的getServletContext方法访问ServletContext

ServletContext getServletContext();                             //返回ServletContext
java.lang.String getFilterName();                               //返回Filter名字
java.util.Enumeration<java.lang.String> getInitParameterNames() //返回初始化参数名
java.lang.String getInitParameter(java.lang.String parameterName)//返回参数

配置方式有两种,一种是@WebFilter注解方法,另一种是通过XML注册方式,以@WebFilter注解为例,下面是可选参数

属性描述
asyncSupportedFilter是否支持异步操作
descriptionFilter描述
dispatcherTypesFilter生效范围
displayNameFilter显示名
filterNameFilter名称
initParamsFilter初始化参数
urlPatternsFilter生效的URL路径
valueFilter生效的URL路径
@WebFilter(filterName = "Security Filter", urlPatterns = "/*",
  initParams = {
    @WebInitParam(name = "A", value = "1")
    @WebInitParam(name = "B", value = "2")
  })

4. 示例程序

package config.filter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;

/**
 * 日志监听器,记录每天的访问情况
 * @author littlemotor
 * @since 18.8.22
 */
@WebFilter(filterName = "LoggingFilter",
           urlPatterns = {"/*"},
           initParams = {
             @WebInitParam(name = "logFileName", value = "log.txt")
           })
public class LoggingFilter implements Filter{

  private PrintWriter viewLogger;
  private PrintWriter counterLogger;
  
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    //String logFileName = filterConfig.getInitParameter("logFileName");
    //String appPath = filterConfig.getServletContext().getRealPath("/");
    //System.out.println(appPath);
    try {
      viewLogger = new PrintWriter(new File("/Users/littlemotor/webLog/","log.txt"));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  }

  /**
   * Filter链,注意在最后加doFilter
   */
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest)request;
    viewLogger.println(new Date() + " " + "URI: " + httpRequest.getRequestURI() );
    viewLogger.flush();  
    chain.doFilter(request, response);
  }

  @Override
  public void destroy() {
    System.out.println("destroying filter");
    if(viewLogger != null) {
      viewLogger.close();
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值