转载:http://blog.sina.com.cn/s/blog_40e2140e01000bad.html
今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间。
一,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”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断
分享到:
相关推荐
Servlet的URL-Pattern匹配规则是Web应用程序中Servlet和Filter配置的核心部分,它决定了Servlet或Filter如何响应特定的HTTP请求。以下是对这些匹配规则的详细解释: 1. **精确匹配** - 在`<url-pattern>`中指定的...
首先,我们需要了解Servlet和Filter的`url-pattern`相关说明。Servlet是一个Java类,负责处理HTTP请求和响应。Filter则是在Servlet执行前后进行预处理和后处理的组件。当一个页面请求到来时,容器会根据`url-pattern...
当你想让一个Filter作用于应用中的所有资源时,你需要在`web.xml`配置文件中定义一个Filter,并设置`<url-pattern>`为`/*`。这样,任何通过HTTP请求访问的应用资源都会先经过这个Filter。例如: ```xml <filter>...
如果多个Filter匹配同一个请求,它们将按照在web.xml中声明的顺序依次执行。 Filter的生命周期包括初始化(init)、过滤(doFilter)和销毁(destroy)三个阶段。初始化阶段,Filter的实例被创建并调用其init方法,...
当请求匹配到过滤器映射时,Tomcat会创建一个过滤器链,并按顺序调用每个过滤器的`doFilter()`方法。过滤器可以决定是否继续调用下一个过滤器,或者直接处理请求。 ```xml <filter> <filter-name>...
在Java Web开发中,Filter过滤器是一种强大的工具,它属于JavaEE规范中的重要组成部分,与Servlet程序、Listener监听器并称为三大组件。Filter的主要职责是拦截客户端的请求和服务器的响应,从而实现数据过滤、权限...
1. **Filter配置**:首先,我们需要在Web应用的`web.xml`配置文件中声明Filter,并关联一个或多个URL模式,这样当匹配这些URL的请求到来时,Filter就会被触发。例如: ```xml <filter> <filter-name>LoginFilter</...
与Servlet不同,Filter可以匹配多个URL模式,匹配顺序与它们在`web.xml`中的定义顺序相同。 `/*`和`/**`的区别在于路径匹配的范围,`/**`会匹配更多的子目录,采用Ant路径匹配规则。Spring框架提供了更灵活的路径...
通过在web.xml中配置`<filter>`和`<filter-mapping>`元素,我们可以控制过滤器的执行顺序和哪些URL需要被过滤。过滤器的配置灵活性很高,可以针对不同的URL模式、HTTP方法等条件进行精确匹配。 以下是一个简单的...
2. 服务器根据请求的URL和Filter映射匹配到Filter链。 3. 按照`web.xml`或注解中定义的顺序,依次调用每个Filter的`doFilter()`方法。 4. 在`doFilter()`方法内,当前Filter执行其逻辑后,调用`FilterChain.doFilter...
<url-pattern>/myservlet</url-pattern> </servlet-mapping> <!-- 配置会话超时 --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎页面 --> <welcome-file-list> ...
在Java Web开发中,Servlet过滤器(Filter)是不可或缺的一部分,它允许开发者在请求到达Servlet之前或响应离开Servlet之后对其进行处理。Servlet过滤器是按照指定的配置顺序进行调用的,能够实现数据的预处理、后...
3. **配置Filter**:在`web.xml`文件中,我们可以通过`<filter>`和`<filter-mapping>`元素定义Filter,并指定其需要拦截的URL模式。 ```xml <filter> <filter-name>MyFilter</filter-name> <filter-class>...
`filter-mapping`定义了过滤器与哪些URL路径关联,`url-pattern`用来指定匹配规则。 在Java配置方式(如Spring Boot)中,可以通过注解`@WebFilter`来配置过滤器: ```java @WebFilter(filterName = "MyFilter", ...
Java Filter是Java Servlet API中的一个重要组件,主要用于在Servlet容器中拦截和处理HTTP请求与响应。在Java Web开发中,Filter是解决诸如字符编码问题、安全控制、日志记录等常见问题的有效工具。以下是对Java ...
- **Filter Chain**:多个过滤器可以按顺序连接起来形成一个过滤器链,每个过滤器依次处理请求。 通过以上介绍,我们可以了解到Servlet过滤器的强大功能及其在Web开发中的重要作用。理解并熟练掌握过滤器的使用可以...
当一个请求到来时,所有匹配的`Filter`会按照它们在`web.xml`中的顺序依次执行`doFilter()`方法。`FilterChain`对象代表了剩余的过滤器链,调用`chain.doFilter()`会将请求传递给下一个过滤器或目标Servlet。 6. *...
通过`<url-pattern>`元素在`web.xml`中配置拦截路径,可以指定哪些URL需要经过Filter。例如,`/admin/*`会拦截所有以`/admin/`开头的URL。 【Filter 拦截方式配置】 可以通过多个`<filter-mapping>`元素为一个...
`Filter`通过在Web应用的部署描述符`web.xml`中配置,与特定的URL模式、Servlet或JSP页面关联。当一个请求匹配到已配置的URL时,`Filter`链会被触发。每个`Filter`都有机会按照定义的顺序对请求进行预处理,然后...