过滤器拦截到响应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

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序的更多相关文章

  1. php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)

    php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...

  2. Java过滤器Filter使用详解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目中有具体应用:https://github.com/ygj0930/Coupl ...

  3. java过滤器filter使用

    一:filter:过滤器,拦截servlet的请求和响应. 1. package jd.com.filter; import javax.servlet.*; import java.io.IOExc ...

  4. java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...

  5. Java过滤器Filter的原理及配置_学习笔记

    Filter中文意思为过滤器.顾名思义,过滤器可在浏览器以及目标资源之间起到一个过滤的作用.例如:水净化器,可以看成是生活中的一个过滤器,他可以将污水中的杂质过滤,从而使进入的污水变成净水. 对于WE ...

  6. 如何在Java的Filter中注入Service???

    今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在s ...

  7. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  8. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

  9. 创建HttpFilter与理解多个Filter代码的执行顺序

    1.自定义的HttpFilter,实现Filter接口 HttpFilter package com.aff.filter; import java.io.IOException; import ja ...

随机推荐

  1. SafeHandle和Dispose z

    SafeHandle最大的意义是封装一个托管资源且本身会执行.NET中的资源释放模式(所谓的Dispose Pattern),这样,开发者在使用非托管资源时,不可以不需要执行繁琐的资源释放模式,而直接 ...

  2. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...

  3. duilib中ListCtrl控件的实现

    转载请说明出处,谢谢~~ 昨天在编程群里聊天,提到了ListCtrl,然后有网友找我,他需要做一个ListCtrl控件,我看过需求后接下了这个活.今天就把大致的思路和过程记录一下.首先看<任务书 ...

  4. .net之单元测试

    一.单元测试的目的是为了提高项目的质量 二..net单元测试的实施步骤是:在已经创建的类文件的某个方法上右键-->选择创建单元测试-->系统会创建单元测试解决方案--->单元测试解决 ...

  5. bzoj 2588 Spoj 10628. Count on a tree(主席树)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  6. 那传说中的P、NP以及NPC问题

    那传说中的P.NP以及NPC问题     (这里只是自己的一些总结) 在讲这几个问题之前,有几个东西是必须要说的,包括时间复杂度.空间复杂度.图灵机什么的.那么我们就慢慢来一一说来.    图灵机:图 ...

  7. HW5.27

    public class Solution { public static void main(String[] args) { int totalCount = 0; int lineCount = ...

  8. leetcode@ [274/275] H-Index & H-Index II (Binary Search & Array)

    https://leetcode.com/problems/h-index/ Given an array of citations (each citation is a non-negative ...

  9. 关于 Java Collections API 您不知道的 5 件事,第 1 部分

    定制和扩展 Java Collections Java™ Collections API 远不止是数组的替代品,虽然一开始这样用也不错.Ted Neward 提供了关于用 Collections 做更 ...

  10. 【WIN32进阶之路】:线程同步技术纲要

    前面博客讲了互斥量(MUTEX)和关键段(CRITICAL SECTION)的使用,想来总觉不妥,就如盲人摸象一般,窥其一脚而言象,难免以偏概全,追加一篇博客查遗补漏. win32下的线程同步技术分为 ...