在一个大型项目中往往有多个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
分享到:
相关推荐
在web应用中,当用户发起对某个资源(如Servlet、JSP、静态文件)的请求时,Servlet容器会按照在`web.xml`中注册的顺序依次调用这些Filter。每个Filter在处理请求时,可以决定是否继续传递请求到下一个Filter,直至...
当请求到达时,Filter会按照配置的顺序依次执行,直到请求传递到目标资源。 5. **Filter的实际应用**: - **安全控制**:Filter可以用来检查请求是否携带正确的认证信息,阻止未授权的访问。 - **性能优化**:...
2. **过滤请求**: 对于每个匹配的HTTP请求,容器按照声明顺序依次调用每个Filter的`doFilter()`方法。 3. **销毁**: 当Web应用停止或者Filter被卸载,容器调用`destroy()`方法释放资源。 ### 三、Filter配置 ...
当一个请求到达Web应用程序时,Filter链会被调用,每个Filter按顺序执行其`doFilter()`方法,传递请求和响应对象到下一个Filter或目标Servlet。 2. **生命周期** Filter有三个主要的方法:`init()`, `doFilter()`,...
当一个请求到来时,Web 容器会按照配置的顺序依次调用 Filter 中的 `doFilter` 方法,直到请求传递到最后的目标资源。同样,响应也会按照相反的顺序经过每个 Filter。 Filter 在实际开发中有多种应用场景: 1. **...
Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。 Filter 接口中有三个重要的方法:init()、doFilter() 和 destroy()。 init() 方法是在 web 应用程序启动时,web 服务器将根据 ...
2. **Filter链**:多个Filter可以组成一个链,按照注册顺序依次执行。每个Filter完成自己的处理后,将请求传递给下一个Filter,直到达到最终的目标Servlet。 3. **配置Filter**:在Web应用的`web.xml`配置文件中,...
多个Filter可以形成一个链,按照声明的顺序依次执行。 - `@WebFilter`注解也可以用于Java EE 6及更高版本的Filter配置,提供更灵活的编程式配置。 4. **Filter的典型应用场景** - **安全控制**:使用Filter检查...
Filter的执行顺序是由它们在web.xml中的顺序决定的。如果多个Filter匹配同一个请求,它们将按照在web.xml中声明的顺序依次执行。 Filter的生命周期包括初始化(init)、过滤(doFilter)和销毁(destroy)三个阶段...
这样,一个Filter链可以按照定义的顺序依次处理请求。 回到主题,"简单的servlet+Filter的例子"可能涉及到一个简单的应用场景,比如登录验证。在用户尝试访问受保护的资源(如Servlet)之前,Filter会检查请求中...
请求会按照配置的顺序依次通过每个Filter的`doFilter()`方法,直到到达目标Servlet。Filter之间是串联的,每个Filter都有机会对请求进行修改或做其他操作。 4. **Filter的实际应用**: - **登录验证**:在用户访问...
- **Filter链**:多个Filter可以串联,形成一个链,请求会按顺序通过每个Filter。 - **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java ...
- 当用户发起请求时,Web服务器根据web.xml中的配置顺序创建并调用Filter链。按照配置顺序,先执行Listener,然后是Filter,接着是Struts拦截器,最后是Servlet。 - Filter的执行顺序取决于它们在web.xml中的配置...
在容器加载Filter时会调用其`init`方法进行初始化,在每次请求到来时调用`doFilter`方法进行过滤,在容器关闭时调用`destroy`方法释放资源。 **Interceptor:** - **定义**:Interceptor是框架级别的概念,比如在...
2. **过滤**: 当请求到达时,服务器根据配置的`filter-mapping`找到相应的Filter,按顺序调用`doFilter()`方法。 3. **销毁**: 应用程序关闭时,服务器调用`destroy()`方法释放Filter资源。 **二、Filter的实现** ...
- **执行**:每次匹配的请求到达时,`doFilter()`方法被调用,它会按配置的顺序调用`Filter`链。 - **销毁**:Web应用关闭时,`destroy()`方法会被调用,用于释放`Filter`占用的资源。 3. **主要功能**: - **...
过滤链是Filter的执行顺序,先声明的Filter先执行。 3. **请求处理**: - **Chain.doFilter()**:当客户端发起请求时,Servlet容器首先调用第一个Filter的`doFilter()`方法。在这个方法内部,Filter可以选择处理...
每个请求都会创建一个新的`FilterChain`,然后按照配置顺序调用`doFilter`方法。 7. **销毁**: 服务器关闭时,会调用Filter的`destroy`方法,清理Filter资源。 **Filter内存马思路** 要构造Filter内存马,关键...
当有多个Filter同时处理一个请求时,服务器会根据配置的顺序依次调用`doFilter()`方法。如果需要改变这个顺序,只需调整`web.xml`中Filter的声明顺序即可。 四、Filter的应用场景 Filter的应用非常广泛,包括但不...