zoukankan      html  css  js  c++  java
  • web容器调用Filter和Servlet顺序学习

    web容器调用Filter和Servlet顺序学习


     一直对Filter和Servlet在哪里被web容器调用迷惑,后查看tomcat源码,揭开了其面纱。
    1. 下面是一个简单的时序图:
    web容器调用Filter和Servlet顺序学习


    2. 对上面时序图中用到的主要类进行分析

    1)         ApplicationFilterChain类,有两个主要函数,下面是省略过会的代码

    public voiddoFilter(request, response) {//暴露在外面的调用接口

    if( Globals.IS_SECURITY_ENABLED ) {

          finalServletRequest req = request;

          finalServletResponse res = response;

          internalDoFilter(req,res);

          return null;

    } else {

    internalDoFilter(request,response);

    }

    }

    private voidinternalDoFilter(request, response) {

    if (pos < n) {//判断是否还有filter需要执行

               ApplicationFilterConfig filterConfig = filters[pos++];

           Filter filter = null;

    filter = filterConfig.getFilter();

    filter.doFilter(request, response, this);

    return ;

    }

           {//filter执行完后,执行servlet

             if ((request instanceofHttpServletRequest) &&

                    (response instanceof HttpServletResponse)) {

                    servlet.service((HttpServletRequest) request,

                                        (HttpServletResponse) response);

                }

    }


    void addFilter(ApplicationFilterConfig filterConfig) {

            if (n == filters.length) {

                ApplicationFilterConfig[] newFilters =

                    new ApplicationFilterConfig[n + INCREMENT];

                System.arraycopy(filters, 0, newFilters, 0, n);

                filters = newFilters;

            }

            filters[n++] = filterConfig;

    }

     

     

    2)         Servlet类的主要方法,以HttpServlet类为例,其主要方法是service(Request,Response)

    public voidservice(ServletRequest req, ServletResponse res)

            throws ServletException, IOException {

            HttpServletRequest  request;

            HttpServletResponse response;

            try {

                request = (HttpServletRequest) req;

                response = (HttpServletResponse) res;

            } catch (ClassCastException e) {

                throw new ServletException("non-HTTP request or response");

            }

            service(request, response);//内部的方法

        }

     

     

    protected voidservice(HttpServletRequest , HttpServletResponse)

            throws ServletException, IOException {

            String method = req.getMethod();

            if (method.equals(METHOD_GET)) {

                long lastModified = getLastModified(req);

                if (lastModified == -1) {

                    doGet(req, resp); //常用的方法

                } else {

                    long ifModifiedSince;

                    try {

    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

                    } catch (IllegalArgumentException iae) {

                    ifModifiedSince = -1;

                    }

                    if (ifModifiedSince < (lastModified / 1000 * 1000)) {

                    maybeSetLastModified(resp, lastModified);

                        doGet(req, resp);

                    } else {

    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

                    }

                }

            } else if (method.equals(METHOD_HEAD)) {

                long lastModified = getLastModified(req);

                maybeSetLastModified(resp, lastModified);

                doHead(req, resp);

            } else if (method.equals(METHOD_POST)) {

                doPost(req, resp);//常用的方法

            } else if (method.equals(METHOD_PUT)) {

                doPut(req, resp);       

            } else if (method.equals(METHOD_DELETE)) {

                doDelete(req, resp);

            } else if (method.equals(METHOD_OPTIONS)) {

                doOptions(req,resp);

            } else if (method.equals(METHOD_TRACE)) {

                doTrace(req,resp);

            } else {

    String errMsg =lStrings.getString("http.method_not_implemented");

                Object[] errArgs = new Object[1];

                errArgs[0] = method;

                errMsg = MessageFormat.format(errMsg, errArgs);

                resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

       

  • 相关阅读:
    Vue.js学习笔记(8)拖放
    Vue.js学习笔记(7)组件详解
    使用了与请求的协议不兼容的地址的解决办法
    修改machine.config遇到System.Net.ServicePointManager 的类型初始值设定项引发异常
    未找到路径“/Agent/SissQrTemplate/AddN”的控制器或该控制器未实现 IController。
    C# .NET 2.0 判断当前程序进程是否为64位运行时 (x64)
    荣耀9开启虚拟按键
    C# .NET 4.5 将多个文件添加到压缩包中
    开IE时 暴卡
    VMware Workstation 安装 mac OS 时遇到 不可恢复错误: (vcpu-0)
  • 原文地址:https://www.cnblogs.com/01picker/p/4526449.html
Copyright © 2011-2022 走看看