Tomcat之CoyoteAdapter源码分析
处理请求接入点
![](https://img.haomeiwen.com/i7310356/fa44d5c275304710.png)
service
org.apache.catalina.connector.CoyoteAdapter#service
这里传入的request是org.apache.coyote.Request类型,是从Socket读取数据后设置的包含各种MessageBytes类型的对象。CoyoteAdapter是处理这种请求Request的一个委托类
Request和Response分别在两个不同的包
org.apache.coyote.Request、rg.apache.coyote.Response
org.apache.catalina.connector.Request、org.apache.catalina.connector.Response
![](https://img.haomeiwen.com/i7310356/091ee758bb3f25af.png)
①、应用层面的请求和相应对象设置属性值。
创建对象,连接对象,设置请求数据的解码
![](https://img.haomeiwen.com/i7310356/96ddf183adc19119.png)
②、解析请求postParseRequest
底层适配类CoyoteAdapter解析底层(coyote包下)req、res,并配置Catalina和应用层request、response的属性值
![](https://img.haomeiwen.com/i7310356/2aabbf0c79047ae4.png)
③、容器调用invoke
设置同步支持(如果支持异步的话)
![](https://img.haomeiwen.com/i7310356/ed6cf9ebd9712ce0.png)
postParseRequest
解析和设置Catalina 和配置的请求参数
1、schemeMB和secure设置
req.schemeMB=http和request.secure=false
![](https://img.haomeiwen.com/i7310356/f091a11308c5cbf3.png)
2、proxyPort/proxyHost设置
![](https://img.haomeiwen.com/i7310356/68e9a8d8c4de9dfb.png)
3、请求uriMB
![](https://img.haomeiwen.com/i7310356/9180ca4703199174.png)
4、decodedUriMB设置
![](https://img.haomeiwen.com/i7310356/a985fede9cc9a86d.png)
parsePathParameters方法解析路径参数,删除路径参数并转换成字节
url解码,
![](https://img.haomeiwen.com/i7310356/eedadae55f552e61.png)
5、serverName获取
![](https://img.haomeiwen.com/i7310356/9c39133d3159bdd0.png)
6、version
![](https://img.haomeiwen.com/i7310356/a01d63964d12485f.png)
7、request.mappingData设置
![](https://img.haomeiwen.com/i7310356/69824a1bf70ba13b.png)
这里org.apache.catalina.connector.Request#mappingData属性值都是null
7.1、map
![](https://img.haomeiwen.com/i7310356/45dd9f8c31b9a8c6.png)
7.2、internalMap
①、映射指定的uri
org.apache.catalina.mapper.Mapper#internalMap
![](https://img.haomeiwen.com/i7310356/511403c4b8c41304.png)
②、获取mappedHost
![](https://img.haomeiwen.com/i7310356/80e20cf047a91392.png)
③、mappingData.host赋值
![](https://img.haomeiwen.com/i7310356/0542a3fe5cecf417.png)
④、Context映射
![](https://img.haomeiwen.com/i7310356/c230f2a5a42550f2.png)
![](https://img.haomeiwen.com/i7310356/ee6e0fdb4cd89841.png)
⑤、contextPath设置
![](https://img.haomeiwen.com/i7310356/34475ca539f00e1a.png)
⑥、context和contextSlashCount设置
![](https://img.haomeiwen.com/i7310356/9b7cd30d743d50aa.png)
⑦、Wrapper设置
![](https://img.haomeiwen.com/i7310356/e8ef7cf544d8770a.png)
对path请求进行截取/testservlet/hello 到/hello
![](https://img.haomeiwen.com/i7310356/debf0c412864f692.png)
Match匹配规则
Rule 1 精确匹配 -- Exact Match
![](https://img.haomeiwen.com/i7310356/f6233bf7fcd9defc.png)
对requestPath、wrapper、wrapperPath、matchType=MappingMatch.EXACT赋值(path=/hello不是仅仅一个/)。如果仅仅一个/则matchType=MappingMatch.CONTEXT_ROOT
![](https://img.haomeiwen.com/i7310356/d218c33e9d470502.png)
Rule 2 前缀匹配 -- Prefix Match
![](https://img.haomeiwen.com/i7310356/46b9d383fa0e5d3c.png)
![](https://img.haomeiwen.com/i7310356/e0bb54087c27f9bc.png)
Rule 3 扩展匹配-- Extension Match
![](https://img.haomeiwen.com/i7310356/1d6121d909ed1fa0.png)
Rule 4 对servlet资源处理-- Welcome resources processing for servlets
![](https://img.haomeiwen.com/i7310356/e1e3912646fd39e9.png)
![](https://img.haomeiwen.com/i7310356/5c2576f7bfe38743.png)
![](https://img.haomeiwen.com/i7310356/8adf592fe294e8f3.png)
![](https://img.haomeiwen.com/i7310356/76874bbfb19aa30d.png)
文件处理
![](https://img.haomeiwen.com/i7310356/853ac20c52706211.png)
Rule 7 默认servlet-- Default servlet
![](https://img.haomeiwen.com/i7310356/6c69f764bfacfb50.png)
![](https://img.haomeiwen.com/i7310356/8c12196508c706ce.png)
映射之后设置
![](https://img.haomeiwen.com/i7310356/31ae0c56575e7170.png)
org.apache.catalina.connector.Request#mappingData映射之后
![](https://img.haomeiwen.com/i7310356/98fbcd782ccf34c3.png)
8、session处理
![](https://img.haomeiwen.com/i7310356/8259294d27cbf1c5.png)
mapRequired = false 结束while循环
![](https://img.haomeiwen.com/i7310356/95923c3922a833d8.png)
9、请求被暂停,mappingData映射数据被重置
![](https://img.haomeiwen.com/i7310356/a49afef51fc592ee.png)
10、redirect重定向
![](https://img.haomeiwen.com/i7310356/57ab823958a58591.png)
11、Filter trace method
![](https://img.haomeiwen.com/i7310356/2f260cd153536fa1.png)
12、doConnectorAuthenticationAuthorization
![](https://img.haomeiwen.com/i7310356/28faf7f475af8376.png)
org.apache.coyote.Request#remoteUser是否被设置
![](https://img.haomeiwen.com/i7310356/d93319d445a93fae.png)
org.apache.coyote.Request#authType是否被设置
![](https://img.haomeiwen.com/i7310356/6f569a69c1740731.png)
invoke
调用容器
总结:
CoyoteAdapter类就是把org.apache.coyote.Request类(接近Socket底层类,可以简单理解为传输层)转换到org.apache.catalina.connector.Request类(可以简单理解为应用层)的过程。
具体实现就是匹配map,设置到connector.Request.mappingData属性值中