其他分享
首页 > 其他分享> > web基础:过滤器

web基础:过滤器

作者:互联网

一、概述

过滤器可以拦截请求,并控制响应,对此,servlet一无所知。与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获并处理请求,另外,servlet结束工作之后,在响应发回给客户端之前,可以用过滤器拦截并处理响应

过滤器可以链接在一起,一个接一个的运行,过滤器并不关心他前面运行了哪些过滤器,也不关系他后边还会运行哪个过滤器。过滤器的运行顺序由web.xml部署文件控制

二、过滤器的生命周期

        过滤器必须实现Filter接口中的三个方法:

void init(FilterConfig var1) throws ServletException;

void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws         IOException, ServletException;

void destroy();

1. init()方法: 

        容器决定实例化一个过滤器时,在init()方法中完成调用过滤器之前的所有初始化任务。例如,保存一个FilterConfig对象的一个引用。

2. doFilter()方法:

        每次容器认为应该对当前请求应用过滤器时,就会调用doFilter()方法,doFilter()方法中做过滤器具体的工作。

3. destroy()方法:

        容器决定删除一个过滤器实例时,会调用destroy()方法,可以在该方法中做实例被撤销之前的一些清理工作。

三、FilterChain

        前文中提到过,过滤器可以链接在一起,共同完成一些事情,达到这一目的主要依靠FilterChain。我们知道,过滤器并不知道请求所涉及到的其他过滤器,那么如何保证过滤器链接的顺序性呢?通过FilterChain可以,FilterChain知道过滤器执行的顺序。

        过滤器的调用顺序可以以栈上的方法进行理解,如下图所示:

四、示例

  <!-- 过滤器 -->
  <filter>
    <filter-name>BeerRequest</filter-name>
    <filter-class>com.wyf.filter.BeerRequestFilter</filter-class>
    <init-param>
      <param-name>LogFileName</param-name>
      <param-value>UserLog.txt</param-value>
    </init-param>
  </filter>
  <!-- 过滤器映射 -->
  <filter-mapping>
    <filter-name>BeerRequest</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
/**
 * 过滤器,非常类似于servlet
 */
public class BeerRequestFilter implements Filter {

    private  FilterConfig fc; //配置

    /**
     * 初始化,通常只需要在其中保持配置config
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.fc = filterConfig; //保持配置filterConfig
        System.out.println("过滤器初始化!");
    }

    /**
     * 过滤器做的具体的工作
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpreq = (HttpServletRequest)servletRequest;
        String name = httpreq.getRemoteUser();
        if(name!=null){
            fc.getServletContext().log("User"+name+" is updating!");
        }
        filterChain.doFilter(servletRequest,servletResponse); //接下来要调用的过滤器或servlet
    }

    /**
     * 销毁
     */
    @Override
    public void destroy() {
        System.out.println("过滤器销毁,完成清理工作!");
    }
}

标签:web,ServletException,void,基础,doFilter,过滤器,servlet,throws
来源: https://blog.csdn.net/sssxlxwbwz/article/details/123627550