为什么会写这个文章呢?
是在做项目的时候遇到了一个问题,问题如下:
用加密后url(*.htm)去访问tomcat的时候,需要对此url进行解码,所以就通过自定义的HttpServletRequestWrapper类在Filter中包装了request,此时url则变为(*.jsp),结果是tomcat还是以静态页面的处理方式对该请求进行处理,导致页面中的‘<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>’等jsp标签没有被解析。
于是就查看了一些tomcat源码,tomcat对请求的处理流程如下:
1)通过TcpWorkerThread获取socket,
2)调用Http11ConnectionHandler的process()对socket进行处理,
3)调用Http11AprProcessor的process()对socket进行处理,
4)调用CoyoteAdapter的service()对request进行处理,
5)调用StandardEngineValve、StanStandardEngineValvedardHostValve、StandardWrapperValve的invoke()方法对request进行处理,
这里重点要说的是StandardWrapperValve的invoke()方法:
1)
// Allocate a servlet instance to process this request
try {
if (!unavailable) {
servlet = wrapper.allocate();// 由于这里url是*.htm,所以tomcat会分配一个htm的Servlet对此请求进行处理
}
} catch (UnavailableException e) {
}
...
2)
// Create the filter chain for this request
ApplicationFilterFactory factory =
ApplicationFilterFactory.getInstance();
ApplicationFilterChain filterChain =
factory.createFilterChain(request, wrapper, servlet);// 为该请求创建相应的FilterChain
...
3)
// Call the filter chain for this request
// NOTE: This also calls the servlet's service() method
try {
...
// 调用filter、Servlet,由于这里的Servlet是在filter调用之前已经分配好的,所以在filter中修改url为*.jsp,并没有调用处理jsp的那个Servlet。
filterChain.doFilter(request.getRequest(),
response.getResponse());
...
} catch (ClientAbortException e) {
}
以上只是个人的一些看法,还有一些疑问是IE是正常的,Firefox、Google是不行的,不知道是怎么回事?
又仔细看了一下tomcat源码,tomcat都调用DefaultServlet对该请求(*.htm),只不过IE不显示‘<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> ’而已。
如果是以‘*.htm’的方式访问Tomcat,Tomcat在请求到达时已为该请求分配好了相应的DefaultServlet去处理,所以在filter中修改是没有用的,代码如下:
public class CoyoteAdapter implements Adapter {
...
public void service(org.apache.coyote.Request req,
org.apache.coyote.Response res)
throws Exception {
...
// 分配相应的容器去处理该请求,
// 比如*.jsp(StandardEngine[Catalina].StandardHost[localhost].StandardContext[/rss].StandardWrapper[default])
if (postParseRequest(req, request, res, response)) {
分享到:
相关推荐
通过对Tomcat请求处理流程中各个组件的解析,我们可以更深入地理解Tomcat的工作原理。这种基于UML序列图的描述方式不仅能够清晰地展现各个组件之间的交互关系,还能够帮助开发者更好地理解Tomcat的架构设计思想。这...
本文将深入探讨 Tomcat 的架构和请求处理流程。 首先,Tomcat 作为一个 HTTP 服务器,其核心功能之一是通过 Socket 进行网络通信,遵循 TCP/IP 协议。Socket 提供了应用程序之间进行低级别网络通信的接口,使得 ...
#### 五、请求处理流程 1. **客户端**发送HTTP请求到Tomcat服务器。 2. **Connector**接收请求,并将其转换成内部请求对象。 3. **Connector**将请求对象传递给对应的`Engine`。 4. `Engine`根据请求中的虚拟主机名...
通过深入学习,读者能够对Tomcat的内部机制有全面而深入的理解,从而更好地优化和调试应用。 Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是开发和部署Java ...
"how tomcat work 中文版" 这个标题和描述重复多次,表明我们关注的主题是关于Tomcat服务器的工作原理的中文解释。Tomcat是一款开源的、基于Java Servlet和JavaServer Pages(JSP)技术的Web应用服务器,由Apache...
- **路由到正确的Context**:根据请求URL,Tomcat将请求路由到对应的Web应用程序(由Context对象管理)。 - **Servlet容器**:Catalina使用Loader加载Web应用的类,用Wrapper对象管理每个Servlet实例。 - **...
3. **Pipeline和Valve**:Tomcat的请求处理流程是通过Valve链来实现的,每个Valve代表一个处理阶段。理解`Pipeline`和`Valve`的概念,有助于了解请求在服务器内部的流转过程。 4. **JMX(Java Management ...
3. **请求处理流程** 当一个HTTP请求到达时,Coyote适配器接收到请求,将其转化为内部表示,然后传递给Catalina进行处理。处理过程中,请求会经过一系列的过滤器,最后由对应的Servlet处理,完成业务逻辑后,响应...
### Tomcat5启动流程与配置详解 #### 一、Tomcat5.0目录结构 Tomcat作为一款广泛使用的...以上是关于Tomcat5启动流程与配置的基本介绍,对于初学者来说,了解这些内容有助于更好地掌握Tomcat的使用技巧和配置方法。
源码中,这些生命周期方法的实现有助于理解Tomcat的内部工作流程。 4. **部署与加载**:Tomcat可以自动或手动部署Web应用程序。源码中的`Host`和`Context`类展示了如何解析WAR文件并加载应用到服务器。 5. **JMX...
本文将基于标题、描述及部分给定内容,全面解析Tomcat的核心机制,尤其是其线程池管理方式,帮助读者深入理解Tomcat如何高效处理请求,以及为何它能在众多Servlet容器中脱颖而出。 ### Tomcat的复杂系统架构 ...
请求处理流水线(Pipeline)是Tomcat中的一个核心概念,它定义了请求处理的顺序,通过一系列的Valve(阀门)对请求进行拦截和处理,这类似于过滤器(Filter)的作用。这些Valve被组织成一个链式结构,每个Valve可以...
这有助于开发者理解Tomcat内部的工作流程,例如,如何处理HTTP请求的生命周期,以及线程池是如何调度和管理的。对于那些想要定制Tomcat或者解决特定问题的人来说,源码解析是极其宝贵的资源。 总之,这个资源包对于...
1. catalina:这是Tomcat的核心模块,负责处理Servlet容器的主要功能,如Servlet和Context的生命周期管理,请求处理等。 2. coyote:Coyote是Tomcat的HTTP/HTTPS连接器,负责接收和发送网络请求。 3. common:这个...
4. "Tomcat源码分析(4)容器处理链接之责任链模式.doc":分析了Tomcat如何利用责任链模式来处理请求,使得请求可以被多个处理器(如过滤器)有序处理。 5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体...
1. 请求处理流程:当客户端发送请求到达Tomcat时,Coyote接收请求并将其转换为内部表示,然后传递给Catalina进行处理。Catalina通过Context、Wrapper和Servlet三级结构,找到对应的Servlet实例,执行其service方法。...
总的来说,`tomcat-connectors-1.2.48-src`是理解Tomcat与HTTPD协同工作的关键,对于开发者和运维人员来说,深入研究这个源码能够提高他们对整个系统架构的理解,从而更好地优化和维护Web服务。通过源码分析,我们...
总结来说,“简单的tomcat实现1”主要涉及了Tomcat的基础架构和工作流程,包括连接器的实现、容器的构建、请求处理逻辑以及Web应用的部署和Servlet的生命周期管理。通过模拟这些关键部分,读者可以更好地理解Tomcat...