`
c_fanatic
  • 浏览: 66319 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Servlet Filter的调用顺序

    博客分类:
  • Java
阅读更多
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函数的执行顺序是无法保证的。
分享到:
评论

相关推荐

    简单的servlet+Filter的例子

    在Filter的`doFilter()`方法中,我们通常会调用`chain.doFilter(request, response)`来将请求传递给下一个Filter或目标Servlet。这样,一个Filter链可以按照定义的顺序依次处理请求。 回到主题,"简单的servlet+...

    servlet_filter.rar_Servlet filter_重写filter

    当用户发起HTTP请求时,Filter会根据`web.xml`或`@WebFilter`注解配置的URL模式匹配到相应的Filter,然后按照配置的顺序依次调用`doFilter()`方法。在`doFilter()`方法中,可以进行预处理(如编码转换)和后处理(如...

    servlet filter

    开发者可以调用`FilterChain.doFilter()`方法将控制权交给下一个Filter或目标Servlet。例如: ```java @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) ...

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

    博主可能详细讲解了如何创建一个基本的Filter类,实现Filter接口,并覆盖doFilter方法,这个方法是Filter的核心,它接受ServletRequest和ServletResponse对象作为参数,以及FilterChain对象,通过调用FilterChain的...

    Servlet中的Filter

    每个Filter的doFilter()方法会被调用,直到请求达到Servlet,或者在Filter中中断过滤链。 4. **Filter接口** - **init()**:在Filter实例化后,Web容器会调用一次init()方法,用于初始化Filter,可以在此方法中...

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

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

    Servlet与jsp与Filter的使用

    每个Filter可以通过FilterChain对象调用下一个Filter或直接调用目标servlet/JSP页面。在Filter中,开发者可以实现以下功能: - 检查请求信息,如用户认证状态、请求参数等。 - 修改请求或响应信息,如添加或删除...

    tomcat、struts2、servlet Filter(过滤器) 工作原理

    当一个请求到达Web应用时,Filter链会被触发,每个Filter按照声明的顺序执行doFilter()方法,然后传递给下一个Filter或最终的目标Servlet。Filter的使用大大增强了Web应用的灵活性和可扩展性。 结合这三个技术,...

    jsp servlet中的过滤器Filter配置总结

    Filter的执行顺序由`&lt;filter-mapping&gt;`在`web.xml`中的顺序决定,先出现的Filter先执行。在Filter中,可以通过调用`doFilter()`方法将请求传递给下一个Filter或目标资源。Filter还可以选择是否中断请求链,通过调用`...

    web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理

    web.xml中的Servlet、Bean、Filter、Listener加载顺序详解 在Java Web应用程序中,web.xml文件扮演着非常重要的角色,它定义了Web应用程序的配置信息,包括Servlet、Bean、Filter、Listener等组件的配置。其中,...

    Servlet_Filter

    当用户请求匹配Filter的URL时,Filter首先被调用,然后通过调用下一个Filter或者直接调用目标Servlet来传递请求。 Servlet和Filter之间的协作非常紧密。Filter可以在请求到达Servlet之前对其进行预处理,例如添加或...

    Servlet和Filter之间的区别与联系

    4. **配置和调用顺序**: 在`web.xml`中,可以通过`&lt;filter-mapping&gt;`来指定Filter的调用顺序和拦截的目标URL。多个Filter可以形成一个链,按照配置的顺序依次处理请求。 5. **生命周期管理**: Servlet和Filter的...

    servlet过滤器技术实例,

    在本实例中,我们将深入探讨Servlet过滤器(Filter)的使用和实现,以及它在实际应用中的重要性。 一、Servlet过滤器简介 Servlet过滤器遵循Java Servlet规范,通过实现`javax.servlet.Filter`接口来创建自定义过滤...

    使用filter拦截servlet和jsp页面的内容,进行过滤后输出

    当一个请求到来时,Servlet容器会按照`web.xml`中定义的顺序调用Filter链。`doFilter()`方法中的`chain.doFilter(request, response)`会将请求传递给下一个Filter或目标Servlet。注意,每个Filter都可以选择是否...

    servlet API zip压缩包

    Filter链的执行顺序由web.xml中的配置决定。 六、监听器(Listener) 监听器是Servlet API中的一种重要组件,可以监听特定事件,比如Session的创建、销毁,Context的初始化、销毁,或者特定Servlet的初始化和销毁等...

    Servlet基础知识总结

    其中`load-on-startup`属性可用来指定Servlet在服务器启动时的加载顺序。 #### 四、如何处理一个请求 在Servlet中,主要通过`service()`方法来处理请求。对于HTTP请求,还可以通过重写`doGet()`、`doPost()`等方法...

    JSP_利用Filter解决Servlet输出中文乱码的问题.docx

    2. **doFilter方法**:这是Filter的核心方法,`doFilter`方法会在每次请求被传递到目标Servlet之前被调用。在这里,我们通过`FilterChain`对象的`doFilter`方法将请求继续传递给下一个过滤器或目标Servlet。 3. **...

    Servlet API官方原版

    FilterChain则用于按顺序调用多个Filter。 8. **Servlet生命周期**:Servlet的生命周期包括加载和初始化、服务、销毁三个阶段。在Web应用启动时,Servlet容器会根据web.xml或注解加载Servlet,并调用`init()`方法...

Global site tag (gtag.js) - Google Analytics