java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

转自https://www.cnblogs.com/zouyitangzaishuo/p/5995099.html
过滤器拦截到响应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配置内容如下:

复制代码


HttpRequestAndResponseFilter
com.rskd_yswb.lib.filter.HttpRequestAndResponseFilter

encoding
utf8



Test2Filter
com.rskd_yswb.lib.filter.Test2Filter


HttpRequestAndResponseFilter
/*

<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>
复制代码

filter的执行顺序如同web.xml中的配置的顺序,在浏览器输入http://localhost:8080/index 控制台将打印如下内容:

HttpRequestAndResponseFilterBefore
Test2FilterBefore
请求处理中
Test2FilterAfter
HttpRequestAndResponseFilterAfter

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值