HttpServletRequest前世今生

我们先从一个下面的demo开始

这段代码的打印结果如下:

GET
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
zhangtong
man

 

2,我们debug看可以看到是RequestFacade中的getMethod方法;RequestFacade是HttpServertRequest的具体实现类

 this.request是org.apache.coyote.Request coyoteRequest类型,最是调用coyoteRequest方法中的getMethod

我们再看下httpServletRequest.getHeader("User-Agent"),httpServletRequest.getParameter("name"),httpServletRequest.getParameter("sex") 发下都是调用coyoteRequest方法

HttpServertRequest大部分方法调用都是调用org.apache.coyote.Request coyoteRequest类中的方法

 

3,接下来我们看下coyoteRequest类,他是什么时候被创建的,什么时候被赋值,什么时候被塞到RequestFacade;要想搞明白这三个问题我们要翻下tomcat源码

Http11Processor是AbstractProcessor实现类
在创建Http11Processor时AbstractProcessor创建org.apache.coyote.Request,org.apache.coyote.Response

 

调用抽象方法的构造方法,如下代码;并且创建完request方法并且将request传递给了inputBuffer;inputBuffer是Http11InputBuffer类型,后面如何将Http协议解析的

Http11Processor主要是处理http协议解析的和封装response数据

 到这里我们解决了上面提到的三个问题的第一个问题coyoteRequest是什么时候创建的。接下来我们看下第二个问题request是如何被赋值的

4,一些是我们访问的http请求协议

GET /testServerlet003/hello HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

 

 http协议解析在Http11processor的service中完成如下

 协议解析在inputBuffer类中完成。(我们回顾一下上面request创建;Http11processor构造方法创建,在构造方法中创建了request,Http11InputBuffer并且这两个类相互引用 )

 

 这两张代码片段都是Http11InputBuffer的方法。fill方法是将socketchannel的数据读到Http11InputBuffer的byteBuffer

 这张图的是Http11InputerBuffer中parseRequestLine方法。我们已经找到request.method赋值的地方。其他的也是类似的我们就不多介绍了。接下来我们在看下HttpServerlet是如何关联上coyoteRequest

5,

 

 serverice是CoyoteAdapter中方法connector.createRequest()就是创建HttpServerletRquest的实现类。创建完HttpServerletRquest的实现类并且将coyoteRequest关联起来

 

到此HttpServerletRequest就分析完了




 

posted @ 2023-08-13 13:28  牛腩炖土豆2023  阅读(180)  评论(0)    收藏  举报