默認連接器
一、UML圖:
1、所有的連接器都要實現Connector接口,必須創建Request對象和Response對象,httpConnector作為默認連接器,肯定也是要實現Connector接口的,同時httpConnector. createRequest方法創建了Request對象,httpConnector. createResponse方法創建了Response對象;
2、httpConnector接收到客戶端請求后,解析請求參數、解析請求header信息、創建Response和Request對象如果放在Connector里面處理,勢必會影響到后續其他客戶端請求的及時響應,因此tomcat采取了HttpProcessor對象來進行這些后續處理,而且HttpProcessor是在單獨的線程里面運行,不會卡住主線程,再有新的客戶端請求到達時,會創建新的HttpProcessor對象并開啟新的線程運行,這樣就能保證連接器能高效及時的響應客戶端請求;
3、httpConnector類維護著一個HttpProcessor的實例池,同時還有池的最小和最大個數的變量,如下:
在start方法啟動連接器時,會初始化minProcessors個HttpProcessor對象放到processors池子里面:
創建HttpProcessor對象時,如果池子里有未使用的HttpProcessor對象,則直接從池子里面取,如果當前正在運行的HttpProcessor對象大于最大個數,則丟掉請求不處理,否則創建一個HttpProcessor對象并放到池子里,然后返回這個HttpProcessor對象:
1、Request對象封裝了客戶端的請求信息,Response對象封裝了返回給客戶端的響應信息;
2、HttpRequestImpl類是Request接口的實現類,cookies數組成員變量存儲了請求的cookie信息,headers變量是一個hashMap類型,存儲了請求head信息的鍵值對,parameters存儲了相關參數的鍵值對,這是一個ParameterMap類型的hash表類型,比hashMap封裝擴展了鎖定屬性;
3、為避免servlet程序員拿到request對象,因為權限過大而造成安全問題,這里采用了門面模式封裝了一個HttpRequestFacade對象,其所有功能都委托給Request對象實現,但是HttpRequestFacade提供的接口有限,將其提供給servlet程序員不會造成安全問題;
4、同樣的,HttpResponseImpl類是Response接口的實現類,HttpResponseFacade作為HttpResponseImpl的門面對象提供給servlet程序員使用,從而很好的解決了安全性問題;
二、流程分析:
1、httpConnector連接器實現了Runnable接口,也就是說他是運行在一個線程里面的,run方法作為線程的運行方法,首先調用ServerSocketFactory.createSocket創建一個ServerSocket對象,并且默認在8080端口上監聽,然后調用ServerSocket.accept在8080端口等待客戶端請求并阻塞線程;
2、如果有客戶端連接請求到達,則httpConnector從accept處返回,然后調用CreateHttpProcessor創建HttpProcessor對象;
3、在創建HttpProcessor對象時,在HttpProcessor構造函數里面創建HttpRequest對象和HttpResponse對象;
4、httpConnector在調用CreateHttpProcessor后,會將服務器與客戶端連接的socket對象賦值給HttpProcessor對象,然后調用HttpProcessor.start方法,由于HttpProcessor也實現了Runnable接口,因此在start方法里面就將HttpProcessor放到線程里運行;
5、HttpProcessor線程的run方法里面,首先獲取剛才賦值的socket對象(如果socket為null則會阻塞到socket被賦值),然后對request請求調用parseConnection, parseRequest, parseHeaders解析請求信息并設置request的成員變量;
6、最后將request和response對象傳遞給Container.invoke方法,將后續的請求處理交給Container容器處理;
評論
查看更多