• 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

  • 相关阅读:
    MIPI DSI协议介绍【转】
    [Android5.1][RK3288] LCD Mipi 调试方法及问题汇总【转】
    [kernel 启动流程] (第六章)第一阶段之——打开MMU【转】
    伙伴系统之伙伴系统概述--Linux内存管理(十五)【转】
    linux syscon and regmap study not【转】
    Linux Reserved Memory 预留内存【转】
    IOMMU & iomap &VFIO & uio【转】
    mipi和dsi【转】
    mipi LCD 的CLK时钟频率与显示分辨率及帧率的关系【转】
    LCD MIPI DSI时钟计算【转】
  • 原文地址:https://www.cnblogs.com/jk-heart/p/8646712.html
Copyright © 2020-2023  润新知