`
wezly
  • 浏览: 480688 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

filter的调用顺序

阅读更多

在一个大型项目中往往有多个servlet过滤器,但是这些servlet过滤器的执行顺序是怎样的呢? 
请看一下例子:
创建两个简单的servlet文件

package filter; 
import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
public class Filter1 implements Filter { 
public void destroy() { 
} 
public void init(FilterConfig config) throws ServletException { 
} 
public void doFilter(ServletRequest request, ServletResponse response, 
  FilterChain chain) throws IOException, ServletException { 
 try { 
  System.out.println("filter1"); 
  chain.doFilter(request, response); 
  System.out.println("filter1  go back"); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
} 
}

package filter; 
import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
public class Filter2 implements Filter { 
public void destroy() { 
} 
public void init(FilterConfig config) throws ServletException { 
} 
public void doFilter(ServletRequest request, ServletResponse response, 
  FilterChain chain) throws IOException, ServletException { 
 try { 
  System.out.println("filter2"); 
  chain.doFilter(request, response); 
  System.out.println("filter2   go back"); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
} 
}

 


在web.xml里面添加映射文件:

<filter> 
   <filter-name>filter1</filter-name> 
   <filter-class>filter.Filter1</filter-class> 
  
 </filter> 
 <filter> 
   <filter-name>filter2</filter-name> 
   <filter-class>filter.Filter2</filter-class> 
 </filter> 
 <filter> 
   <filter-name>filter3</filter-name> 
   <filter-class>filter.Filter3</filter-class> 
 </filter> 
 <filter-mapping> 
   <filter-name>filter1</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
   <filter-name>filter2</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 

 
对于这个项目的任意一个jsp以及其他请求都要经过这两个servlet过滤器的过滤
因为<url-pattern>/*</url-pattern>
程序执行结果
filter1
filter2
filter2   go back
filter1  go back
如果把web.xml映射文件修改为

</filter> 
 <filter> 
   <filter-name>filter2</filter-name> 
   <filter-class>filter.Filter2</filter-class> 
 </filter> 
 <filter> 
   <filter-name>filter3</filter-name> 
   <filter-class>filter.Filter3</filter-class> 
 </filter> 
<filter-mapping> 
   <filter-name>filter2</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 <filter-mapping> 
   <filter-name>filter1</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 

 
则程序的执行结果为:
filter2
filter1
filter1  go back
filter2   go back


仔细观察这两个映射文件的不同之处我们可以看出,servlet过滤器的执行顺序就是servlet过滤器在web.xml里面映射文件的顺序,即定义越靠前的执行越早。


对于上例,如果再建立一个testfilter.jsp:


<head>
<title>Test Page</title>
</head>
<body>
Test filter1.
<% System.out.println("In testfilter.jsp now!"); %>
</body>


 访问这个jsp文件后,在应用服务器控制台将输出:

filter2 
filter1 

In testfilter1.jsp now!

filter1  go back 
filter2   go back

 

分享到:
评论

相关推荐

    Filter简介和工作原理

    在web应用中,当用户发起对某个资源(如Servlet、JSP、静态文件)的请求时,Servlet容器会按照在`web.xml`中注册的顺序依次调用这些Filter。每个Filter在处理请求时,可以决定是否继续传递请求到下一个Filter,直至...

    Java-filter测试程序

    当请求到达时,Filter会按照配置的顺序依次执行,直到请求传递到目标资源。 5. **Filter的实际应用**: - **安全控制**:Filter可以用来检查请求是否携带正确的认证信息,阻止未授权的访问。 - **性能优化**:...

    Filter知识点整理文档

    2. **过滤请求**: 对于每个匹配的HTTP请求,容器按照声明顺序依次调用每个Filter的`doFilter()`方法。 3. **销毁**: 当Web应用停止或者Filter被卸载,容器调用`destroy()`方法释放资源。 ### 三、Filter配置 ...

    Servlet之Filter深入讲解及实例研究

    当一个请求到达Web应用程序时,Filter链会被调用,每个Filter按顺序执行其`doFilter()`方法,传递请求和响应对象到下一个Filter或目标Servlet。 2. **生命周期** Filter有三个主要的方法:`init()`, `doFilter()`,...

    J2EE之filter的应用

    当一个请求到来时,Web 容器会按照配置的顺序依次调用 Filter 中的 `doFilter` 方法,直到请求传递到最后的目标资源。同样,响应也会按照相反的顺序经过每个 Filter。 Filter 在实际开发中有多种应用场景: 1. **...

    Filter(过滤器)简介和工作原理

    Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。 Filter 接口中有三个重要的方法:init()、doFilter() 和 destroy()。 init() 方法是在 web 应用程序启动时,web 服务器将根据 ...

    Filter

    2. **Filter链**:多个Filter可以组成一个链,按照注册顺序依次执行。每个Filter完成自己的处理后,将请求传递给下一个Filter,直到达到最终的目标Servlet。 3. **配置Filter**:在Web应用的`web.xml`配置文件中,...

    Java Filter相关资料

    多个Filter可以形成一个链,按照声明的顺序依次执行。 - `@WebFilter`注解也可以用于Java EE 6及更高版本的Filter配置,提供更灵活的编程式配置。 4. **Filter的典型应用场景** - **安全控制**:使用Filter检查...

    简单使用Filter模拟Servlet中的过滤器

    Filter的执行顺序是由它们在web.xml中的顺序决定的。如果多个Filter匹配同一个请求,它们将按照在web.xml中声明的顺序依次执行。 Filter的生命周期包括初始化(init)、过滤(doFilter)和销毁(destroy)三个阶段...

    简单的servlet+Filter的例子

    这样,一个Filter链可以按照定义的顺序依次处理请求。 回到主题,"简单的servlet+Filter的例子"可能涉及到一个简单的应用场景,比如登录验证。在用户尝试访问受保护的资源(如Servlet)之前,Filter会检查请求中...

    Filter1源代码

    请求会按照配置的顺序依次通过每个Filter的`doFilter()`方法,直到到达目标Servlet。Filter之间是串联的,每个Filter都有机会对请求进行修改或做其他操作。 4. **Filter的实际应用**: - **登录验证**:在用户访问...

    java 中如何使用filter过滤器

    - **Filter链**:多个Filter可以串联,形成一个链,请求会按顺序通过每个Filter。 - **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java ...

    Servlet中的Filter

    - 当用户发起请求时,Web服务器根据web.xml中的配置顺序创建并调用Filter链。按照配置顺序,先执行Listener,然后是Filter,接着是Struts拦截器,最后是Servlet。 - Filter的执行顺序取决于它们在web.xml中的配置...

    Interceptor与Filter的区别

    在容器加载Filter时会调用其`init`方法进行初始化,在每次请求到来时调用`doFilter`方法进行过滤,在容器关闭时调用`destroy`方法释放资源。 **Interceptor:** - **定义**:Interceptor是框架级别的概念,比如在...

    JSP-Filter的简单练习

    2. **过滤**: 当请求到达时,服务器根据配置的`filter-mapping`找到相应的Filter,按顺序调用`doFilter()`方法。 3. **销毁**: 应用程序关闭时,服务器调用`destroy()`方法释放Filter资源。 **二、Filter的实现** ...

    java中的filter

    - **执行**:每次匹配的请求到达时,`doFilter()`方法被调用,它会按配置的顺序调用`Filter`链。 - **销毁**:Web应用关闭时,`destroy()`方法会被调用,用于释放`Filter`占用的资源。 3. **主要功能**: - **...

    java filter 执行过程例子

    过滤链是Filter的执行顺序,先声明的Filter先执行。 3. **请求处理**: - **Chain.doFilter()**:当客户端发起请求时,Servlet容器首先调用第一个Filter的`doFilter()`方法。在这个方法内部,Filter可以选择处理...

    S04-tomcat之Filter内存马1

    每个请求都会创建一个新的`FilterChain`,然后按照配置顺序调用`doFilter`方法。 7. **销毁**: 服务器关闭时,会调用Filter的`destroy`方法,清理Filter资源。 **Filter内存马思路** 要构造Filter内存马,关键...

    Java_Filter过滤机制详解.

    当有多个Filter同时处理一个请求时,服务器会根据配置的顺序依次调用`doFilter()`方法。如果需要改变这个顺序,只需调整`web.xml`中Filter的声明顺序即可。 四、Filter的应用场景 Filter的应用非常广泛,包括但不...

Global site tag (gtag.js) - Google Analytics