Filter是一个很有用的东西,使用filter可以修改request, response, session, application中的内容。
1. javax.servlet.Filter有两个重要的方法
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
其中init方法用来作一些初始化的方法,而doFilter方法用来执行真正的过滤操作。
2. Filter的部署方法
在web.xml中要声明filter元素,并分配需要其处理的url,如下:
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.baidu.Filter1</filter-class>
</filter>
<filter>
<filter-name>Filter2</filter-name>
<filter-class>com.baidu.Filter2</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>
3. doFilter函数的执行顺序
当某个url请求匹配了多个Filter时,应用服务器将多个Filter组织成FilterChain,这个链的执行顺序是由其<filter-mapping>元素在web.xml文件中的顺序决定的。
doFilter函数可以过滤请求或者响应,当其过滤完请求后将调用FilterChain的doFilter函数让FilterChain中的下一个Filter来过滤请求。最先过滤请求的Filter将最后过滤相应,下面是个简单的例子。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
system.out.println(“filter request here ----”);
// todo:
chain.doFilter(request,response);
system.out.println(“filter response here ----”);
// todo:
}
4.init函数的执行顺序
对于不同的应用服务器,Filter的init函数的执行时间是不同的,例如:tomcat会在tomcat启动的时候执行init函数,而weblogic等一些其他的应用服务器则会在该Filter匹配的url被首次请求的时候加载。
(下面的部分是我通过实验猜想的,不一定正确。)
对于tomcat而言,tomcat启动时会解析web.xml文件,然后按照<filter>元素的顺序将各个Filter元素加载到一个HashMap中。解析完成后,会从HashMap中一个个的拿出Filter元素,串行的执行其init函数(这里的执行有先后关系,是在一个线程中执行的)。所以在tomcat中定义的多个Filter其init函数的执行顺序就是其在HashMap中的散列顺序,具体来说与其在web.xml文件中的定义位置及其名字有关。
对于HashMap来说,如果其元素固定不变,则其顺序也是固定不变的,但当元素个数发生变化时,便不能保证其顺序(例如:当有两个元素时,A在B的前面,当再加入20个元素的时候A就不一定在B的前面了),所以init函数的执行顺序是无法保证的。
分享到:
相关推荐
在Filter的`doFilter()`方法中,我们通常会调用`chain.doFilter(request, response)`来将请求传递给下一个Filter或目标Servlet。这样,一个Filter链可以按照定义的顺序依次处理请求。 回到主题,"简单的servlet+...
当用户发起HTTP请求时,Filter会根据`web.xml`或`@WebFilter`注解配置的URL模式匹配到相应的Filter,然后按照配置的顺序依次调用`doFilter()`方法。在`doFilter()`方法中,可以进行预处理(如编码转换)和后处理(如...
开发者可以调用`FilterChain.doFilter()`方法将控制权交给下一个Filter或目标Servlet。例如: ```java @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) ...
博主可能详细讲解了如何创建一个基本的Filter类,实现Filter接口,并覆盖doFilter方法,这个方法是Filter的核心,它接受ServletRequest和ServletResponse对象作为参数,以及FilterChain对象,通过调用FilterChain的...
每个Filter的doFilter()方法会被调用,直到请求达到Servlet,或者在Filter中中断过滤链。 4. **Filter接口** - **init()**:在Filter实例化后,Web容器会调用一次init()方法,用于初始化Filter,可以在此方法中...
当一个请求到达Web应用程序时,Filter链会被调用,每个Filter按顺序执行其`doFilter()`方法,传递请求和响应对象到下一个Filter或目标Servlet。 2. **生命周期** Filter有三个主要的方法:`init()`, `doFilter()`,...
每个Filter可以通过FilterChain对象调用下一个Filter或直接调用目标servlet/JSP页面。在Filter中,开发者可以实现以下功能: - 检查请求信息,如用户认证状态、请求参数等。 - 修改请求或响应信息,如添加或删除...
当一个请求到达Web应用时,Filter链会被触发,每个Filter按照声明的顺序执行doFilter()方法,然后传递给下一个Filter或最终的目标Servlet。Filter的使用大大增强了Web应用的灵活性和可扩展性。 结合这三个技术,...
Filter的执行顺序由`<filter-mapping>`在`web.xml`中的顺序决定,先出现的Filter先执行。在Filter中,可以通过调用`doFilter()`方法将请求传递给下一个Filter或目标资源。Filter还可以选择是否中断请求链,通过调用`...
web.xml中的Servlet、Bean、Filter、Listener加载顺序详解 在Java Web应用程序中,web.xml文件扮演着非常重要的角色,它定义了Web应用程序的配置信息,包括Servlet、Bean、Filter、Listener等组件的配置。其中,...
当用户请求匹配Filter的URL时,Filter首先被调用,然后通过调用下一个Filter或者直接调用目标Servlet来传递请求。 Servlet和Filter之间的协作非常紧密。Filter可以在请求到达Servlet之前对其进行预处理,例如添加或...
4. **配置和调用顺序**: 在`web.xml`中,可以通过`<filter-mapping>`来指定Filter的调用顺序和拦截的目标URL。多个Filter可以形成一个链,按照配置的顺序依次处理请求。 5. **生命周期管理**: Servlet和Filter的...
在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用中的重要性。 一、Servlet过滤器简介 Servlet过滤器遵循Java Servlet规范,通过实现`javax.servlet.Filter`接口来创建自定义过滤...
当一个请求到来时,Servlet容器会按照`web.xml`中定义的顺序调用Filter链。`doFilter()`方法中的`chain.doFilter(request, response)`会将请求传递给下一个Filter或目标Servlet。注意,每个Filter都可以选择是否...
Filter链的执行顺序由web.xml中的配置决定。 六、监听器(Listener) 监听器是Servlet API中的一种重要组件,可以监听特定事件,比如Session的创建、销毁,Context的初始化、销毁,或者特定Servlet的初始化和销毁等...
其中`load-on-startup`属性可用来指定Servlet在服务器启动时的加载顺序。 #### 四、如何处理一个请求 在Servlet中,主要通过`service()`方法来处理请求。对于HTTP请求,还可以通过重写`doGet()`、`doPost()`等方法...
2. **doFilter方法**:这是Filter的核心方法,`doFilter`方法会在每次请求被传递到目标Servlet之前被调用。在这里,我们通过`FilterChain`对象的`doFilter`方法将请求继续传递给下一个过滤器或目标Servlet。 3. **...
FilterChain则用于按顺序调用多个Filter。 8. **Servlet生命周期**:Servlet的生命周期包括加载和初始化、服务、销毁三个阶段。在Web应用启动时,Servlet容器会根据web.xml或注解加载Servlet,并调用`init()`方法...