Servlet和filter是J2EE研发中常用的技术,使用方便,设置简单,老少皆宜。
估计大多数朋友都是直接设置用,也没有关心过具体的细节,今天遇见一个问题,上网查了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文件中,以下语法用于定义映射:
以”/’开头和以”/*”结尾的是用来做路径映射的。
以前缀”*.”开头的是用来做扩展映射的。
”是用来定义default servlet映射的。
剩下的都是用来定义周详映射的。比如: /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在Servlet容器中注册,并通过`<filter>`和`<filter-mapping>`元素在web.xml配置文件中定义其拦截的目标Servlet或URL模式。当用户请求匹配这些配置的资源时,Filter会先于Servlet执行,执行完后,Filter再将...
而Filter(过滤器)是Servlet API的一部分,它提供了一种机制,可以在请求到达目标资源之前或之后对请求和响应进行拦截处理。Filter在处理Web请求时扮演着不可或缺的角色,比如日志记录、权限验证、内容压缩等。以下...
- `<servlet-mapping>`元素将URL与Servlet关联,`<url-pattern>`指定匹配的URL模式。 4. **请求处理**: - `doGet()`和`doPost()`方法处理HTTP GET和POST请求,分别对应HTTP协议的两种主要请求方式。 - 使用`...
`Servlet和Filter的url匹配url-pattern-JSP编程教程`以及`servlet和JSP过滤器Filter-JSP教程`可能提供了关于如何配置`Filter`以匹配特定URL模式的示例,这对于控制访问权限和执行预处理逻辑非常重要。 综上所述,`...
虽然描述部分为空,但我们可以从标题推测,博主可能详细讲解了如何创建一个基本的Filter类,实现Filter接口,并覆盖doFilter方法,这个方法是Filter的核心,它接受ServletRequest和ServletResponse对象作为参数,...
<url-pattern>/dbconnect</url-pattern> </servlet-mapping> </web-app> ``` 4. **编写Java代码**: 在Servlet的`doGet`或`doPost`方法中,你可以通过JNDI(Java Naming and Directory Interface)查找之前在...
Servlet容器如Tomcat允许你在Filter中使用正则表达式来指定需要过滤的URL模式。例如,创建一个只对以`/admin`开头的URL执行过滤的过滤器: ```java @WebFilter(urlPatterns = "/admin/*") public class ...
<url-pattern>/</url-pattern>//˴Ϊservletȡıǰϡ/;//hello(---ĿĿ¼/hello) </servlet-mapping> ``` - **`<servlet-name>`**:这里再次出现的`servlet-name`应该与上面`servlet`元素中定义的名称相匹配,以便...
3. **匹配URL**:根据`web.xml`中的`servlet-mapping`,服务器找到对应的Servlet。 4. **Servlet实例化**:如果Servlet还没有被实例化,服务器会创建一个新的Servlet实例。 5. **初始化**:执行Servlet的`init()`...
Tomcat作为Servlet容器,它遵循Servlet规范来运行和管理Servlet。在Servlet中,有以下几个关键概念: 1. **Listener(监听器)** 监听器是Java EE中的一种组件,它们监听特定对象的事件并进行响应。例如,`...
这里需要注意的是,`<servlet-name>`必须与`<servlet>`元素中的`servlet-name`相匹配。 ##### 3. 加载Spring配置文件 为了让Spring能够正确加载配置文件,我们需要在`web.xml`中添加监听器来加载Spring的上下文...
<url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,所有匹配`/`的请求都会经过`CORSFilter`进行处理。 以上步骤完成后,Tomcat服务器就能根据配置允许来自指定源的跨域请求了。当然,实际部署时,你...
2. 服务器根据请求的URL和Filter映射匹配到Filter链。 3. 按照`web.xml`或注解中定义的顺序,依次调用每个Filter的`doFilter()`方法。 4. 在`doFilter()`方法内,当前Filter执行其逻辑后,调用`FilterChain.doFilter...
如果使用`<url-pattern>`,则过滤器将应用于所有匹配该模式的URL;如果使用`<servlet-name>`,则过滤器仅应用于指定的Servlet。 - `<dispatcher>`:指定过滤器在哪些情况下被调用,这是本文的重点。 #### ...
- **`<url-pattern>`**:在`web.xml`中通过URL模式将请求映射到Servlet。 - **路径匹配**:支持精确匹配和模糊匹配,如`/example`和`/*.jsp`。 6. **Servlet的会话管理** - **`HttpSession`接口**:用于创建、...
1. **Filter配置**:首先,我们需要在Web应用的`web.xml`配置文件中声明Filter,并关联一个或多个URL模式,这样当匹配这些URL的请求到来时,Filter就会被触发。例如: ```xml <filter> <filter-name>LoginFilter</...
6. **过滤器(Filter)**:Servlet API还提供了Filter接口,允许在请求到达Servlet之前对其进行拦截和处理。过滤器可以用来实现登录检查、字符编码转换、日志记录等功能。 7. **监听器(Listener)**:监听器是实现...