Servlet过滤器工作过程

Servlet过滤器工作过程

新建一个javaweb项目。如下的web.xml配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <filter>
        <filter-name>PerformanceFilter</filter-name>
        <filter-class>com.lyx.filter.PerformanceFilter</filter-class>
    </filter>
    <filter>
        <filter-name>PerformanceFilter2</filter-name>
        <filter-class>com.lyx.filter.PerformanceFilter2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PerformanceFilter</filter-name>
        <url-pattern>/PerformanceServlet</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>PerformanceFilter2</filter-name>
        <url-pattern>/PerformanceServlet</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>PerformanceServlet</servlet-name>
        <servlet-class>com.lyx.servlet.PerformanceServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PerformanceServlet</servlet-name>
        <url-pattern>/PerformanceServlet</url-pattern>
    </servlet-mapping>
</web-app>


有两个filter,其中PerformanceFilter如下:

package com.lyx.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class PerformanceFilter implements Filter {

    private FilterConfig config;

    public PerformanceFilter() {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        System.out.println("=======filter1 start=====" + httpServletRequest.getRequestURI());
        chain.doFilter(request, response);  //把处理权交给下一个filter
        System.out.println("=======filter1 end=======" + httpServletRequest.getRequestURI());
    }

    @Override
    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;
    }
}

PerformanceFilter2如下:

package com.lyx.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 在这个filter中统计请求到响应的时间
 */
public class PerformanceFilter2 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        System.out.println("=======filter2 start=====" + httpServletRequest.getRequestURI());

        long start = System.currentTimeMillis();
        chain.doFilter(req, resp);
        long end = System.currentTimeMillis();
        System.out.println("total=" + (end - start));

        System.out.println("=======filter2 end=======" + httpServletRequest.getRequestURI());
    }

    public void init(FilterConfig config) throws ServletException {

    }

}


其中servlet如下:

package com.lyx.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(name = "PerformanceServlet",
        urlPatterns = {"/PerformanceServlet"},
        loadOnStartup = 1)
public class PerformanceServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public PerformanceServlet() {
        super();
    }


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1> Hello! " + name + " !</h1>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}


ok,启动web程序,查看后台打印情况:

=======filter1 start=====/PerformanceServlet

=======filter2 start=====/PerformanceServlet

total=2

=======filter2 end=======/PerformanceServlet

=======filter1 end=======/PerformanceServlet

很直观的反映了filter的执行过程,尤其当多个filter匹配时。。。


总结多个filter的执行过程:

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


===END===

你可能感兴趣的:(Servlet过滤器工作过程)