Log Filter Analysis

这里是一个日志Filter,这个Filter负责拦截所有的用户请求,并将请求的信息记录在日志中。源码如下:

@WebFilter(filterName="log" ,urlPatterns={"/*})

public class LogFilter implements Filter

{

         //FilterConfig可用于访问Filter的配置信息

         private FilterConfig config;

         //实现初始化

         public void init(FilterConfig config)

         {

                   this.config = config;

         }

         //实现销毁方法

         public void destroy()

         {

                   this.config = null;

          }

           //执行过滤的核心方法

          public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException

          {

             //下面代码用于对用户请求执行预处理

            //获取servletContext对象,用于记录日志

              ServletContext context = this.config.getServletContext();

               long before = System.currentTimeMillis();

                System.out.println("开始过滤......");

                //将请求转换成HttpServletRequest请求

                HttpServletRequest hrequest = (HttpServletRequest)request;

                //输出提示信息

                 System.out.println("Filter已经截获到用户的请求的地址:"+hrequest.getServletPath());

                //Fileter只是链式处理,请求依然放行到目的地址

                 chain.doFilter(request,response);

                //下面的代码用于对服务器响应执行后处理

                long after = System.currentTimeMillis();

                //输出提示信息

                System.out.println("过滤结束");

                //输出提示信息

                System.out.println("请求被定位到"+hrequest.getRequestURL() + "所话的事件为:"+(after - before));

           }

}

doFilter()方法可以实现对用户请求进行预处理,也可以实现对服务器-响应进行后处理,分界线为是否调用chain.doFilter(),执行该方法前,对用户请求进行预处理,执行后对服务器进行后处理。 在上面的请求Filter中,仅在日志记录请求的URL,对所有的请求都执行chain.doFilter(request,response)方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HTTPSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,response)方法。

Filter概述 
Filter是javax.servlet包中的一个接口,一个filter是对客户请求/响应进行拦截任务的一个对象。Filter调用doFilter()方法,传送给该方法的FilterConfig ,包含其初始化参数。

Filter的工作流程:

当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。 
这里写图片描述

多个过滤器同时过滤一个请求时,组成过滤链FilterChain,服务器按web.xml中定义过滤器先后顺序组成一条链,然后执行doFilter()方法。 
执行流程: 

执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>…….——>第n个过滤器的chain.doFilter()之前的代码——>所请求Servlet的service()方法中的代码——>所请求的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。 

参照于文章:https://blog.csdn.net/csdnyoyo/article/details/51194246

 

posted on 2018-03-25 20:46  My-heart  阅读(142)  评论(0编辑  收藏  举报