java 過濾器Filter中chain.doFilter()之前和之后代碼的執行順序


過濾器攔截到響應url的請求后會先執行doFilter()方法中chain.doFilter()之前的代碼,然后執行下一個過濾器或者servelt。緊接着執行chain.doFilter()之后的代碼。

一下為兩個過濾器的執行順序:

過濾器一:

package com.rskd_yswb.lib.filter;

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

public class HttpRequestAndResponseFilter implements Filter {
    private FilterConfig filterConfig;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        resp.setCharacterEncoding(this.filterConfig.getInitParameter("encoding"));
        System.out.println("HttpRequestAndResponseFilterBefore");
        chain.doFilter(req, resp);
        System.out.println("HttpRequestAndResponseFilterAfter");
    }

    public void init(FilterConfig config) throws ServletException {
        this.filterConfig = config;
    }

}

過濾器二:

package com.rskd_yswb.lib.filter;

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


public class Test2Filter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("Test2FilterBefore");
        chain.doFilter(req, resp);
        System.out.println("Test2FilterAfter");
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

 

要執行的servlet:

package com.rskd_yswb.servelt;

import com.rskd_yswb.javabean.db.ConsumerEntity;
import com.rskd_yswb.lib.db.DBConnection;
import com.rskd_yswb.lib.db.GenerateSqlStatement;
import com.rskd_yswb.lib.freemarker.FreeMarker;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanMapHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.util.HashMap;
import java.util.Map;


public class IndexServlet extends javax.servlet.http.HttpServlet {
    private static Logger logger = LogManager.getLogger(IndexServlet.class);

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        String sql = new GenerateSqlStatement().select("*").from("consumer").get();
        try {
            Map<String, ConsumerEntity> consumer = new QueryRunner().query(DBConnection.getConnection(), sql, new BeanMapHandler<String, ConsumerEntity>(ConsumerEntity.class, "username"));
        } catch (Exception e) {
            logger.debug("IndexServlet Error:" + e.getMessage());
        }
        Map<String, Object> root = new HashMap<String, Object>();
        try {
            FreeMarker.getFreemarker().getTemplate("index.ftl").process(root, response.getWriter());
            System.out.println("請求處理中");
        } catch (TemplateException e) {
            logger.debug("IndexServlet Error:" + e.getMessage());
        }
    }
}

 

 

web.xml配置內容如下:

<web-app>
    <filter>
        <filter-name>HttpRequestAndResponseFilter</filter-name>
        <filter-class>com.rskd_yswb.lib.filter.HttpRequestAndResponseFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf8</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>Test2Filter</filter-name>
        <filter-class>com.rskd_yswb.lib.filter.Test2Filter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HttpRequestAndResponseFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>Test2Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>IndexServlet</servlet-name>
        <servlet-class>com.rskd_yswb.servelt.IndexServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>IndexServlet</servlet-name>
        <url-pattern>/index</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>IndexServlet</servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>
</web-app>

 

filter的執行順序如同web.xml中的配置的順序,在瀏覽器輸入http://localhost:8080/index 控制台將打印如下內容:

HttpRequestAndResponseFilterBefore
Test2FilterBefore
請求處理中
Test2FilterAfter
HttpRequestAndResponseFilterAfter

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM