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