一直没有仔细去研究下filter ,最近系统的测试了下:

先看代码吧

  1. FirstFilter.java
  2. ==================
  3. package com.test.filter;
  4. import java.io.IOException;
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. public class FirstFilter implements Filter {
  12. @Override
  13. public void destroy() {
  14. }
  15. @Override
  16. public void doFilter(ServletRequest request, ServletResponse response,
  17. FilterChain chain) throws IOException, ServletException {
  18. System.out.println("before invoke firstFilter's chain.doFilter() ..");
  19. chain.doFilter(request, response);
  20. System.out.println("after invoke firstFilter's chain.doFilter() ..");
  21. }
  22. @Override
  23. public void init(FilterConfig arg0) throws ServletException {
  24. System.out.println("firstFilter init()...");
  25. }
  26. }
  27. ============
  28. SecondFilter.java
  29. ==============
  30. package com.test.filter;
  31. import java.io.IOException;
  32. import javax.servlet.Filter;
  33. import javax.servlet.FilterChain;
  34. import javax.servlet.FilterConfig;
  35. import javax.servlet.ServletException;
  36. import javax.servlet.ServletRequest;
  37. import javax.servlet.ServletResponse;
  38. public class SecondFilter implements Filter {
  39. @Override
  40. public void destroy() {
  41. }
  42. @Override
  43. public void doFilter(ServletRequest request, ServletResponse response,
  44. FilterChain chain) throws IOException, ServletException {
  45. System.out.println("before invoke secondFilter's chain.doFilter() ..");
  46. chain.doFilter(request, response);
  47. System.out.println("after invoke secondFilter's chain.doFilter() ..");
  48. }
  49. @Override
  50. public void init(FilterConfig filterConfig) throws ServletException {
  51. System.out.println("secondFilter init()...");
  52. }
  53. }
  54. ==========
  55. FirstServlet.java
  56. =============
  57. package com.test.servlet;
  58. import java.io.IOException;
  59. import javax.servlet.ServletException;
  60. import javax.servlet.http.HttpServlet;
  61. import javax.servlet.http.HttpServletRequest;
  62. import javax.servlet.http.HttpServletResponse;
  63. public class FirstServlet extends HttpServlet {
  64. @Override
  65. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  66. throws ServletException, IOException {
  67. System.out.println("servlet doGet be invoked...");
  68. req.getRequestDispatcher("test.jsp").forward(req, resp);
  69. }
  70. @Override
  71. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  72. throws ServletException, IOException {
  73. // TODO Auto-generated method stub
  74. doGet(req, resp);
  75. }
  76. }
  77. =========
  78. web.xml
  79. ===========
  80. <?xml version="1.0" encoding="UTF-8"?>
  81. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  82. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  83. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  84. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  85. <welcome-file-list>
  86. <welcome-file>index.jsp</welcome-file>
  87. </welcome-file-list>
  88. <filter>
  89. <filter-name>firstFilter</filter-name>
  90. <filter-class>com.test.filter.FirstFilter</filter-class>
  91. </filter>
  92. <filter>
  93. <filter-name>secondFilter</filter-name>
  94. <filter-class>com.test.filter.SecondFilter</filter-class>
  95. </filter>
  96. <filter-mapping>
  97. <filter-name>secondFilter</filter-name>
  98. <url-pattern>/*</url-pattern>
  99. </filter-mapping>
  100. <filter-mapping>
  101. <filter-name>firstFilter</filter-name>
  102. <url-pattern>/*</url-pattern>
  103. </filter-mapping>
  104. <servlet>
  105. <servlet-name>firstServlet</servlet-name>
  106. <servlet-class>com.alimama.servlet.FirstServlet</servlet-class>
  107. </servlet>
  108. <servlet-mapping>
  109. <servlet-name>firstServlet</servlet-name>
  110. <url-pattern>/firstServlet</url-pattern>
  111. </servlet-mapping>
  112. </web-app>
  113. ============

然后发布,发现打印的日志如下:

。。。

firstFilter init()...
secondFilter init()...

。。。

2008-10-23 11:36:43 org.apache.catalina.startup.Catalina start
信息: Server startup in 3665 ms

这里过滤器初始化好了。

当我们访问我们的 应用:http://127.0.0.1:8080/appName

发现打印日记如下:

before invoke secondFilter's chain.doFilter() ..
before invoke firstFilter's chain.doFilter() ..
after invoke firstFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

当我们将web.xml中filter的位置进行调整后:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>index.jsp</welcome-file>
  8. </welcome-file-list>
  9. <filter>
  10. <filter-name>firstFilter</filter-name>
  11. <filter-class>com.test.filter.FirstFilter</filter-class>
  12. </filter>
  13. <filter>
  14. <filter-name>secondFilter</filter-name>
  15. <filter-class>com.test.filter.SecondFilter</filter-class>
  16. </filter>
  17. <filter-mapping>
  18. <filter-name>firstFilter</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21. <filter-mapping>
  22. <filter-name>secondFilter</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping></span>
  25. <servlet>
  26. <servlet-name>firstServlet</servlet-name>
  27. <servlet-class>com.alimama.servlet.FirstServlet</servlet-class>
  28. </servlet>
  29. <servlet-mapping>
  30. <servlet-name>firstServlet</servlet-name>
  31. <url-pattern>/firstServlet</url-pattern>
  32. </servlet-mapping>
  33. </web-app>

然后在启动应用,会看到打印:

before invoke firstFilter's chain.doFilter() ..

before invoke secondFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

after invoke firstFilter's chain.doFilter() ..

总结:

filter的执行顺序是按照web.xml中定义的顺序进行执行的(当多个filter都匹配的时候)。

filter的执行顺序的更多相关文章

  1. Servlet 3.0 之@WebFilter怎么控制多个filter的执行顺序

    之前我们控制多个filter的执行顺序是通过web.xml中控制filter的位置来控制的,放在上面的会比放在下面的先执行,如下“用户登录检查过滤器”会比“接口日志过滤器”先执行   <!-- ...

  2. 04_过滤器Filter_03_多个Filter的执行顺序

    [Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链. *web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Fi ...

  3. 拦截器的四种拦截方式以及Filter的执行顺序(17/4/8)

    一:拦截方式 需要在配置文件web.xml配置 在对应filter-mapping节点下 如下 <filter-mapping> <filter-name>BFilter< ...

  4. @WebFilter怎么控制多个filter的执行顺序

    转自:http://blog.csdn.net/liming_0820/article/details/53332070 之前我们控制多个filter的执行顺序是通过web.xml中控制filter的 ...

  5. java-过滤器Filter_多个Filter的执行顺序

    http://www.cnblogs.com/HigginCui/p/5772514.html [Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个 ...

  6. 转:Filter的执行顺序与实例

    转:http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html Filter的执行顺序与实例 Filter介绍 Filter可认为是Ser ...

  7. 过滤器Filter_03_多个Filter的执行顺序

    过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filt ...

  8. Web API中常用Filter的执行顺序举例讲解

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  9. Asp.net Mvc (Filter及其执行顺序)

    应用于Action的Filter 在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能判断登录与否或用户权限,决策输出缓存,防盗链,防蜘蛛,本地化设置,实现动态Actionfi ...

随机推荐

  1. Unix 入门

    说明:转自以为大神的笔记. 首先,我们一起看看UNIX的目录,因为清楚了目录,才能对UNIX的框架有个大概的印象!当然这里讲的是系统正常运转所必须的,并且一定不能删除或者修改.  / 是系统的根目录: ...

  2. 正则表达式 ——python 基础

    一.引言 正则表达式是含有文本和特别字符的字符串,这些文本和特别字符描述的模式可以识别各种字符串. 正则表达式的强大之处在于特殊符号的应用,特殊符号定义了字符集合.子组匹配,模式重复次数...正是这些 ...

  3. vb6 webbrowser 事件捕获

    Private WithEvents htmlDocument As htmlDocument Private WithEvents btnCompute As MSHTML.HTMLButtonEl ...

  4. IIS6下PHP环境的资源未找到(404)问题

    故障现象: 无法找到该页, 404错误

  5. 01-Java基础知识:数据类型与变量、标识符、运算符、表达式

    Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2).  int ( ...

  6. Java 编程实践

    创建一个54个元素的整数数组,并将其元素值依次赋值为:1~54,用于表示一副牌的54张.再创建一个12个元素的整数数组,用于表示某玩家手中的牌,然后从前一数组中随机抽取12个元素赋值给该数组.打印后一 ...

  7. unity,生成的mac版游戏切场景时卡死解法

    unity版本为5.1.1,在编辑器里运行没问题,build出的windows版运行也没问题,但build出的mac版在个别场景切换时会卡死,通过查看log(查看build版本log的方法参考:htt ...

  8. svn安装

    方法三.无法连接网络的情况(link链接) 1.从官网下载 Site-1.6.5.zip 2.解压Site-1.6.5.zip至${eclipse}PluginsSubclipse-1.6.5.zip ...

  9. SqlParameter设定的value值为0时、调用的存储过程获取到的值却为null解决方法

    原C#代码如下: if (query != null) { switch (query.MethodFlag) { //进出口退补税额统计表 case (int)EnumClassifyCorrect ...

  10. Javascript 错误捕获

    一.一般写JS代码很少捕获异常,建议捕获异常,具体代码如下: 1.写法一: try { //具体代码 } catch(error) { alert("Error:" + error ...