今天忽然心血来潮,想知道具体的servlet filter的顺序..于是测试:
测试环境:apache-tomcat-6.0.16
加载顺序init顺序:
filter-->servlet
处理请求顺序:
filter-->servlet-->filter
销毁顺序:
servlet-->filter
在这里粘贴前辈发表过的文章,web.xml的mapping处理
http://foxty.iteye.com/blog/39332
引用
一,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”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
分享到:
相关推荐
当请求到达时,Filter会按照配置的顺序依次执行,直到请求传递到目标资源。 5. **Filter的实际应用**: - **安全控制**:Filter可以用来检查请求是否携带正确的认证信息,阻止未授权的访问。 - **性能优化**:...
例如,使用Eclipse或IntelliJ IDEA等集成开发环境(IDE)可以方便地创建、配置和测试Servlet和Filter。同时,像Tomcat或Jetty这样的应用服务器提供了运行和调试Servlet和Filter的平台。开发者还可以利用Maven或...
开发者可以使用注解(如`@WebServlet`, `@WebFilter`, `@WebListener`)来声明Servlet、Filter和Listener,而无需在web.xml配置文件中进行硬编码。这极大地提高了代码的可读性和部署的灵活性。 2. **异步处理**:...
6. **Filter链的改进**:现在,Filter可以通过`doFilter(ServletRequest, ServletResponse, FilterChain)`方法中的`FilterChain`对象按顺序调用下一个Filter,允许更灵活的过滤器配置。 7. **WebSocket支持**:尽管...
Filter可以串联形成一个过滤链,按照定义的顺序执行。 6. **JSP与Servlet关系**:JSP(JavaServer Pages)是另一种Java Web技术,它允许开发者在HTML页面中嵌入Java代码。JSP最终会被编译为Servlet,执行逻辑后再...
- **属性详解**:`@WebServlet`注解有多个属性,如`name`、`urlPatterns`、`loadOnStartup`等,可以灵活地配置Servlet的名称、映射路径和加载顺序。 4. **实际应用中的好处** - **简化配置**:无web.xml部署减少...
6. **Filter和FilterChain**:Servlet API还定义了`Filter`接口,允许开发者在请求到达Servlet之前或之后对其进行拦截和处理。`FilterChain`则允许一个过滤器链中的多个过滤器按顺序执行。 7. **Servlet的多线程...
然而,对于开发环境,开发者可能需要将此库加入到构建路径,以便编译和测试Servlet代码。 总之,Servlet-API.jar是Java Web开发的基石,提供了处理HTTP请求和构建动态Web应用的核心工具。理解并熟练运用Servlet API...
5. **源码分析**:博客可能涉及到对Filter的源码分析,例如分析`javax.servlet.Filter`接口和相关的实现类,理解其内部逻辑和工作流程。 6. **工具使用**:标签中的“工具”可能意味着博客中提到了某些工具或框架...
Servlet 3.0的一大亮点就是支持零XML配置,开发者可以通过注解直接在类或方法上声明Servlet、Filter和Listener。例如,我们可以使用`@WebServlet`、`@WebFilter`和`@WebListener`注解来替代传统的web.xml配置,使得...
过滤器在Servlet 3.0中也得到了加强,我们可以使用`@WebFilter`注解来声明过滤器,同时可以通过`@FilterMapping`来指定过滤器的URL模式。过滤器链的控制也更加灵活,可以实现动态过滤器的注册和执行顺序的控制。 ...
在web.xml文件中,Servlet可以通过<Servlet>、<ServletMapping>等元素进行配置,指定Servlet名称、URL模式、加载顺序等。 10. **动态注册Servlet**: 自JSP 2.5规范起,可以通过`@WebServlet`注解动态注册Servlet...
5. **过滤器链(Filter Chain)**:多个过滤器可以串联起来形成过滤器链,按照定义的顺序逐个执行。过滤器链允许开发者在单个请求中执行多个操作,如身份验证、授权、数据转换等。 6. **配置过滤器**:在`web.xml`...
在这个例子中,`name`属性定义了Servlet的名称,`urlPatterns`定义了多个URL映射,而`loadOnStartup`则指定了Servlet在应用启动时的加载顺序。 除了Servlet配置,基于Annotation的过滤器(Filter)和监听器...
8. **过滤器链的优化**:过滤器(Filter)可以定义多个,且可以根据需要按顺序或并行执行,提高了过滤器的灵活性。 9. **MIME类型匹配**:Servlet3.0允许通过`@.WebServlet`的`mimeMapping`属性指定URL与MIME类型的...
在Spring Boot应用中,`Filter`是一个至关重要的组件,它允许开发者在HTTP请求处理的生命周期中插入自定义逻辑。`Filter`是Java Servlet规范...在Idea中,编写和测试`Filter`十分便捷,可以帮助我们快速实现这些功能。
每个过滤器都按照在`web.xml`中的顺序依次执行`doFilter()`方法,直到请求到达目标Servlet。如果一个过滤器选择不转发请求,可以通过不调用`Chain.doFilter()`来终止请求的处理。 至于压缩包中的`test`文件,由于...
同时,过滤器可以使用`@WebFilter`注解定义,并可以通过`@Priority`注解设置优先级,控制过滤器的执行顺序。 最后,Servlet3还增加了对WebSocket的支持,这是一种双向通信协议,允许服务器和客户端进行全双工通信。...
通常,开发者需要在web.xml中定义Filter,声明其类名、过滤的URL模式以及在请求处理链中的顺序。例如: ```xml <filter> <filter-name>MyFilter</filter-name> <filter-class>...
- 在web.xml中配置Servlet,可以通过调整load-on-startup值来控制Servlet的初始化顺序。 - 使用线程池可以提高并发处理能力,减少请求等待时间。 - 使用Filter拦截请求,进行预处理或后处理,例如登录验证、日志...