一,servlet容器对url的匹配过程:
当一个请求发送到servlet容器的时候,容器 先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test /aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做 servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不 同,后文会提到)。其匹配规则和顺序如下:
1. 精确路径匹配。例 子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
2. 最长路径匹配。例 子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。
根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。
对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一 个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。
二,url-pattern详解
在web.xml文件中,以下语法用于定义映射:
l 以”/’开头和以”/*”结尾的是用来做路径映射的。
l 以前缀”*.”开头的是用来做扩展映射的。
l “/” 是用来定义default servlet映射的。
l 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
- 浏览: 502106 次
- 性别:
- 来自: 沈阳
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
相关推荐
filter 的加载顺序是在 servlet 之前的,因为 filter 需要对请求和响应进行过滤和修改,从而实现对 Web 应用的安全和过滤。servlet 的加载顺序是最后的,因为 servlet 需要处理请求和响应,从而实现对 Web 应用的...
而Filter则是在Servlet执行前后进行拦截、处理或修改请求和响应的一种机制,它提供了更灵活的控制和增强应用的能力。 首先,我们来看Servlet。Servlet生命周期包括初始化、服务、销毁三个主要阶段。当服务器启动...
需要注意的是,虽然`CharacterEncodingFilter`被映射了两次,但实际执行顺序是由`filter-mapping`标签的出现顺序决定的。因此,在请求到达`.do`路径前,会先执行`SecurityFilter`,然后再执行`...
当一个请求到达Web应用程序时,Filter链会被调用,每个Filter按顺序执行其`doFilter()`方法,传递请求和响应对象到下一个Filter或目标Servlet。 2. **生命周期** Filter有三个主要的方法:`init()`, `doFilter()`,...
Servlet Filter是Java Servlet API中的一个重要概念,它是对HTTP请求和响应进行拦截处理的机制,用于在请求被实际的Servlet处理之前或之后执行特定的操作。在这个压缩包“servlet_filter.rar”中,我们聚焦于Servlet...
- Filter的执行顺序取决于它们在web.xml中的配置顺序。每个Filter的doFilter()方法会被调用,直到请求达到Servlet,或者在Filter中中断过滤链。 4. **Filter接口** - **init()**:在Filter实例化后,Web容器会...
Filter的运作依赖于FilterChain对象,这是一个设计模式的应用,用于管理多个Filter的执行顺序。当一个请求到达时,服务器会根据web.xml配置文件中的过滤器映射,依次调用每个Filter的doFilter方法。每个Filter可以...
Filter的执行顺序是由它们在web.xml中的顺序决定的。如果多个Filter匹配同一个请求,它们将按照在web.xml中声明的顺序依次执行。 Filter的生命周期包括初始化(init)、过滤(doFilter)和销毁(destroy)三个阶段...
你可以通过调整这些标签的位置来控制过滤器的执行顺序。 3. **Servlet(服务程序)** Servlet是实现了`javax.servlet.Servlet`或其子接口的类,它们负责处理HTTP请求和生成响应。在`web.xml`中,Servlet通过`...
当一个请求经过多个Filter时,Filter链会按照它们在`web.xml`中的顺序依次执行`doFilter()`方法。这意味着,你可以创建多个Filter,每个Filter都有不同的职责,共同协作完成复杂的功能。 在实际开发中,Filter常常...
一个Filter链可以包含多个Filter,这些Filter会按照它们在web.xml文件中定义的顺序依次执行。 在Web应用中,Filter的配置通常在web.xml文件中完成,其中定义了Filter的类名、映射路径以及Filter的初始化参数。...
初始化发生在Filter首次被请求时,服务阶段是Filter执行其核心功能的地方,销毁发生在应用关闭或Filter不再使用时。 2. **Filter链**:在一个Web应用中,可以定义多个Filter,它们形成一个过滤链。请求会按顺序通过...
在Java Web开发中,`Servlet`、`Filter`和`Listener`是三个核心组件,它们在构建动态Web应用程序中扮演着重要角色。本篇将详细阐述这三个概念以及它们的工作原理和应用场景。 首先,我们来了解`Servlet`。Servlet是...
Filter的执行顺序由`<filter-mapping>`在`web.xml`中的顺序决定,先出现的Filter先执行。在Filter中,可以通过调用`doFilter()`方法将请求传递给下一个Filter或目标资源。Filter还可以选择是否中断请求链,通过调用`...
当一个请求到来时,Servlet容器会按照`web.xml`中定义的顺序调用Filter链。`doFilter()`方法中的`chain.doFilter(request, response)`会将请求传递给下一个Filter或目标Servlet。注意,每个Filter都可以选择是否...
当一个请求到达Web应用时,Filter链会被触发,每个Filter按照声明的顺序执行doFilter()方法,然后传递给下一个Filter或最终的目标Servlet。Filter的使用大大增强了Web应用的灵活性和可扩展性。 结合这三个技术,...
过滤链是Filter的执行顺序,先声明的Filter先执行。 3. **请求处理**: - **Chain.doFilter()**:当客户端发起请求时,Servlet容器首先调用第一个Filter的`doFilter()`方法。在这个方法内部,Filter可以选择处理...
web.xml文件中的Servlet、Bean、Filter、Listener的加载顺序和执行顺序对应用程序的执行结果产生了重要的影响。只有正确地配置和理解这些组件的加载顺序和执行顺序,才能确保应用程序的正确执行。
过滤器链的概念使得多个过滤器可以按顺序执行,每个过滤器都可以决定是否将请求传递给下一个过滤器或直接终止。 二、Filter生命周期 每个Servlet过滤器都具有三个关键方法: 1. `init(FilterConfig config)`: 过滤...