版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
保密北京恒華偉業(yè)科技股份有限公司2012年09月Tomcat功能與架構(gòu)設(shè)計(jì)分析保密北京恒華偉業(yè)科技股份有限公司Tomcat功能與架構(gòu)設(shè)計(jì)2目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題2目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框3Java類(lèi)加載機(jī)制類(lèi)加載是java語(yǔ)言提供的最強(qiáng)大的機(jī)制之一。盡管類(lèi)加載并不是熱點(diǎn)話題,但作為編程人員都應(yīng)該了解其工作機(jī)制,明白怎樣去配合其工作。熟悉了類(lèi)加載機(jī)制可以使我們節(jié)省很多時(shí)間,而不必浪費(fèi)在調(diào)試ClassNotFoundException等異常上,且為我們開(kāi)發(fā)高擴(kuò)展性的應(yīng)用程序提供了一些思路。類(lèi)加載的作用:加載Java應(yīng)用程序所需的字節(jié)碼文件(*.class、*.jar);提供一種在運(yùn)行時(shí)動(dòng)態(tài)、靈活地定位資源(代碼和數(shù)據(jù))的方式;允許在運(yùn)行時(shí)利用多種不同資源創(chuàng)建應(yīng)用程序,并提供命名空間機(jī)制,使同一資源的多個(gè)版本在虛擬機(jī)上共存;可與安全體系結(jié)構(gòu)集成;提供在運(yùn)行時(shí)組裝應(yīng)用程序所需的服務(wù)。3Java類(lèi)加載機(jī)制類(lèi)加載是java語(yǔ)言提供的最強(qiáng)大的機(jī)制4Java類(lèi)加載器Java缺省使用如下三種類(lèi)型類(lèi)裝入器啟動(dòng)(Bootstrap)類(lèi)加載器:引導(dǎo)類(lèi)裝入器是用本地代碼實(shí)現(xiàn)的類(lèi)裝入器,它負(fù)責(zé)將<Java_Runtime_Home>/lib下面的類(lèi)庫(kù)加載到內(nèi)存中。由于引導(dǎo)類(lèi)加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)者無(wú)法直接獲取到啟動(dòng)類(lèi)加載器的引用,所以不允許直接通過(guò)引用進(jìn)行操作。標(biāo)準(zhǔn)擴(kuò)展(Extension)類(lèi)加載器:擴(kuò)展類(lèi)加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將<Java_Runtime_Home>/lib/ext或者由系統(tǒng)變量java.ext.dir指定位置中的類(lèi)庫(kù)加載到內(nèi)存中。開(kāi)發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類(lèi)加載器。系統(tǒng)(System)類(lèi)加載器:系統(tǒng)類(lèi)加載器是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將系統(tǒng)類(lèi)路徑(CLASSPATH)中指定的類(lèi)庫(kù)加載到內(nèi)存中。開(kāi)發(fā)者可以直接使用系統(tǒng)類(lèi)加載器。4Java類(lèi)加載器Java缺省使用如下三種類(lèi)型類(lèi)裝入器啟動(dòng)5類(lèi)加載器的委托機(jī)制1.首先判斷該類(lèi)型是否已經(jīng)被加載2.如果沒(méi)有被加載,就委托給父類(lèi)加載或者委派給啟動(dòng)類(lèi)加載器加載3.如果存在父類(lèi)加載器,就委派給父類(lèi)加載器加載4.如果不存在父類(lèi)加載器,就檢查是否是由啟動(dòng)類(lèi)加載器加載的類(lèi)5.如果父類(lèi)加載器和啟動(dòng)類(lèi)加載器都不能完成加載任務(wù),才調(diào)用自身的加載功能5類(lèi)加載器的委托機(jī)制1.首先判斷該類(lèi)型是否已經(jīng)被加載2.6Tomcat中類(lèi)加載器Common類(lèi)加載器負(fù)責(zé)加載TomcatHOME/common/class下的.Class文件和common/lib中的jar包,這些類(lèi)可以被Tomcat內(nèi)核和每個(gè)Web應(yīng)用程序都可以看見(jiàn),如servlet.jar等Catalina類(lèi)加載器從server/classes和server/lib下加載類(lèi),Catalina加載的類(lèi)只對(duì)Tomcat服務(wù)器內(nèi)核可見(jiàn),對(duì)Web應(yīng)用程序不可見(jiàn),對(duì)于運(yùn)行Tomcat內(nèi)核的線程,它的上下文類(lèi)加載器就是Catalina類(lèi)加載器Shared類(lèi)加載器負(fù)責(zé)從share/classes和share/lib中加載類(lèi),它加載的類(lèi)只對(duì)所有Web應(yīng)用程序有效,對(duì)Tomcat不可見(jiàn).WebappX類(lèi)加載器負(fù)責(zé)加載Web應(yīng)用程序的/web-INF/classes和lib目錄下的類(lèi),只對(duì)當(dāng)前Web應(yīng)用程序有效,對(duì)于運(yùn)行每個(gè)Web應(yīng)用程序的線程,他們的上下文類(lèi)加載器就是它們各自的WebappX類(lèi)加載器6Tomcat中類(lèi)加載器Common類(lèi)加載器負(fù)責(zé)加載Tomc7目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題7目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過(guò)相互作用,形成一個(gè)完善的有機(jī)體。8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過(guò)相互9Tomcat總體框架結(jié)構(gòu)分析Server
Server代表整個(gè)Catalinaservlet容器。在server.xml配置文件中必須是頂層元素且唯一,給它配置的屬性代表整個(gè)容器的屬性。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardServerListener
所有server.xml中的監(jiān)聽(tīng)器都實(shí)現(xiàn)了LifecycleListener接口。當(dāng)server中的各種組件在start、stop等事件發(fā)生時(shí)觸發(fā)相應(yīng)的操作。
如:JasperListener用來(lái)在所有web應(yīng)用程序啟動(dòng)前初始化jasper(JSP編譯)。9Tomcat總體框架結(jié)構(gòu)分析Server
10Tomcat總體框架結(jié)構(gòu)分析
Service
Service是這樣一個(gè)集合:它由一個(gè)或者多個(gè)Connector,以及一個(gè)共享的處理引擎(Engine)組成。Engine負(fù)責(zé)處理所有Connector所獲得的客戶(hù)請(qǐng)求。
默認(rèn)實(shí)現(xiàn):
org.apache.catalina.core.StandardService10Tomcat總體框架結(jié)構(gòu)分析
11Tomcat總體框架結(jié)構(gòu)分析Connector
一個(gè)連接器(Connector)將在某個(gè)指定端口上偵聽(tīng)客戶(hù)請(qǐng)求,并將獲得的請(qǐng)求交給Engine來(lái)處理,從Engine處獲得響應(yīng)結(jié)果,并返回給客戶(hù)端。
Tomcat有兩個(gè)典型的連接器,一個(gè)直接偵聽(tīng)來(lái)自客戶(hù)端瀏覽器的http請(qǐng)求,一個(gè)偵聽(tīng)來(lái)自其它Web服務(wù)器的請(qǐng)求。
11Tomcat總體框架結(jié)構(gòu)分析Connector
12Connector的工作原理CoyoteHttp/1.1Connector在端口8080處偵聽(tīng)來(lái)自客戶(hù)瀏覽器的http請(qǐng)求,CoyoteJK2Connector在端口8009處偵聽(tīng)來(lái)自其它Web服務(wù)器(比如Apache)的servlet/jsp代理請(qǐng)求。
當(dāng)使用CoyoteHttp/1.1Connector時(shí),Tomcat作為獨(dú)立的Web容器,同時(shí)扮演Web服務(wù)器和Servlet容器的雙重角色。當(dāng)使用CoyoteJK2Connector時(shí),Tomcat只扮演Servlet容器的角色,Web服務(wù)器則由Apache或者其他服務(wù)器來(lái)提供,由于這些專(zhuān)有的Web服務(wù)器在處理靜態(tài)資源的性能和效率上要比Tomcat提供的Web服務(wù)器要好,所以經(jīng)常將Tomcat和Apache配合使用。12Connector的工作原理Coyote13Tomcat總體框架結(jié)構(gòu)分析Engine
處理引擎(Engine)代表一個(gè)Service所屬的請(qǐng)求處理機(jī),它接受所有連接器傳遞過(guò)來(lái)的客戶(hù)端請(qǐng)求,將處理結(jié)果返回給連接器,由連接器將最終響應(yīng)返回給客戶(hù)端。Engine必須配置在Service組件下。
處理引擎下可以配置多個(gè)虛擬主機(jī)(VirtualHost),每個(gè)虛擬主機(jī)都有一個(gè)域名。當(dāng)處理引擎獲得一個(gè)請(qǐng)求時(shí),它把該請(qǐng)求匹配到某個(gè)虛擬主機(jī)上,把請(qǐng)求交給該虛擬主機(jī)來(lái)處理。處理引擎有一個(gè)默認(rèn)虛擬主機(jī),當(dāng)請(qǐng)求無(wú)法匹配到任何一個(gè)虛擬主機(jī)上時(shí),交給默認(rèn)虛擬主機(jī)來(lái)處理。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardEngine13Tomcat總體框架結(jié)構(gòu)分析Engine
14Tomcat總體框架結(jié)構(gòu)分析Host
代表一個(gè)虛擬主機(jī),每個(gè)虛擬主機(jī)和某個(gè)網(wǎng)絡(luò)域名(DomainName)相匹配。每個(gè)虛擬主機(jī)下都可以部署(deploy)一個(gè)或者多個(gè)Web應(yīng)用程序(WebApplication),每個(gè)Web應(yīng)用程序?qū)?yīng)于一個(gè)Context,有一個(gè)Contextpath。當(dāng)虛擬主機(jī)獲得一個(gè)請(qǐng)求時(shí),將把該請(qǐng)求匹配到某個(gè)Context上,然后把該請(qǐng)求交給該Context來(lái)處理。匹配的方法是“最長(zhǎng)匹配”,一個(gè)path=""的Context將成為該虛擬主機(jī)的默認(rèn)Context。所有無(wú)法和其它Context的路徑名匹配的請(qǐng)求都將最終和該默認(rèn)Context匹配。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardHost
14Tomcat總體框架結(jié)構(gòu)分析Host
代15Tomcat總體框架結(jié)構(gòu)分析Context
一個(gè)Context對(duì)應(yīng)于一個(gè)Web應(yīng)用程序,一個(gè)Web應(yīng)用程序由一個(gè)或者多個(gè)Servlet組成。Context在創(chuàng)建的時(shí)候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WebApp/Web-INF/web.xml載入Servlet類(lèi)。當(dāng)Context獲得請(qǐng)求時(shí),將在自己的映射表(mappingtable)中尋找相匹配的Servlet類(lèi)。如果找到,則執(zhí)行該類(lèi),獲得請(qǐng)求的響應(yīng),并返回。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardContext15Tomcat總體框架結(jié)構(gòu)分析Context
16Tomcat的核心類(lèi)圖所有的容器對(duì)象,都繼承LifeCycle,也即具有生命周期的方法,init(),start(),stop(),destroy(),具有LifecycleState屬性(可以看一下這個(gè)屬性的內(nèi)容)16Tomcat的核心類(lèi)圖所有的容器對(duì)象,都繼承LifeCy17Tomcat總體框架結(jié)構(gòu)分析—啟動(dòng)catalina.bat中setMAINCLASS=org.apache.catalina.startup.Bootstrap17Tomcat總體框架結(jié)構(gòu)分析—啟動(dòng)catalina.ba18Tomcat組件啟動(dòng)流程圖18Tomcat組件啟動(dòng)流程圖19啟動(dòng)過(guò)程都做了什么1.初始化目錄
設(shè)置CatalinaHome、CatalinaBase,初始化System環(huán)境信息2.初始化類(lèi)加載器(ClassLoader)
初始化三個(gè)類(lèi)加載器commonLoader、catalinaLoader、sharedLoader;這是要從perties中讀取配置,即jar包的配置。3.構(gòu)建容器
對(duì)server、service、engine、host等容器對(duì)象進(jìn)行實(shí)例化,開(kāi)始這些對(duì)象的生命周期。4.部署Web應(yīng)用
掃描webapps、conf/Catalina/localhost目錄,進(jìn)行war包、應(yīng)用程序目錄、contex配置文件的加載;19啟動(dòng)過(guò)程都做了什么1.初始化目錄2.初始化類(lèi)加載器(20Tomcat嵌入早期版本中,如Tomcat5中,提供了Embedded類(lèi)用于在java應(yīng)用中嵌入。在新版本的Tomcat中,Embedded已經(jīng)不建議使用。Tomcat7中,提供了專(zhuān)門(mén)的Embedded版本。當(dāng)然,我們可以直接構(gòu)建Catalina對(duì)象實(shí)現(xiàn)Tomcat的嵌入應(yīng)用;也可以參考或者直接改造Bootstrap類(lèi)實(shí)現(xiàn)嵌入。20Tomcat嵌入早期版本中,如Tomcat5中,提供了E21Tomcat容器的結(jié)構(gòu)21Tomcat容器的結(jié)構(gòu)22容器的工作原理
1.ClassLoaerTomcat通過(guò)WebappClassLoader加載web應(yīng)用程序,通過(guò)WebappClassLoader確保各個(gè)應(yīng)用相互獨(dú)立,運(yùn)行期間互不干擾。
2.容器生命周期
應(yīng)用LifeCycle生命周期接口定義各級(jí)容器的初始化、啟動(dòng)、停止、銷(xiāo)毀等動(dòng)作,并應(yīng)用組合設(shè)計(jì)模式把Server、Service、Engine、Host、Context這幾級(jí)容器有效的整合為有機(jī)體,協(xié)調(diào)完成JSP解析、編譯、初始化以及響應(yīng)客戶(hù)端請(qǐng)求等這種任務(wù)。
3.Connector
容器接收Connector傳遞過(guò)來(lái)的客戶(hù)端(瀏覽器或者webserver)請(qǐng)求,并把響應(yīng)結(jié)果通過(guò)Connector發(fā)回到客戶(hù)端(瀏覽器)。22容器的工作原理1.ClassLoaer23目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題23目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache.catalinaTomcat核心類(lèi)庫(kù),規(guī)范了Tomcat的總體架構(gòu),定義了Server、Service、Host、Connector、Context、Session及Cluster等關(guān)鍵組件及這些組件的實(shí)現(xiàn),這個(gè)子模塊大量運(yùn)用了Composite設(shè)計(jì)模式。同時(shí)也規(guī)范了Catalina的啟動(dòng)及停止等事件的執(zhí)行流程
org.apache.coyoteCoyote連接器,實(shí)現(xiàn)了Http1.1協(xié)議,實(shí)現(xiàn)了對(duì)請(qǐng)求和響應(yīng)對(duì)象的構(gòu)建。24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache下其他包el
:
el表達(dá)式定義、解析處理jasper:
負(fù)責(zé)jsp頁(yè)面的解析,jsp屬性的驗(yàn)證,同時(shí)也負(fù)責(zé)將jsp頁(yè)面
動(dòng)態(tài)轉(zhuǎn)換為java代碼并編譯成class文件juli:
日志管理naming:
資源管理,包括數(shù)據(jù)庫(kù)連接池、EJB、mail等通過(guò)JNDI獲取的
內(nèi)容25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.servlet
Servlet和Jsp規(guī)范的實(shí)現(xiàn)模塊,我們非常熟悉的javax.servlet.Servlet接口、javax.servet.http.HttpServlet類(lèi)及javax.servlet.jsp.HttpJspPage就位于這個(gè)子模塊中;26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.serv27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放windows或Linux平臺(tái)上啟動(dòng)和關(guān)閉Tomcat的腳本文件/conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml/doc:存放Tomcat文檔【下面這幾個(gè)目錄在Tomcat6、7中已經(jīng)去掉,合并為lib目錄】/server:包含三個(gè)子目錄:classes、lib和webapps/server/lib:存放Tomcat服務(wù)器所需的各種JAR文件/server/webapps:存放Tomcat自帶的兩個(gè)WEB應(yīng)用admin應(yīng)用和manager應(yīng)用/common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問(wèn)的jar文件/shared/lib:存放所有web應(yīng)用都可以訪問(wèn)的jar文件(但是不能被Tomcat服務(wù)器訪問(wèn))/logs:存放Tomcat執(zhí)行時(shí)的日志文件/webapps:Tomcat的主要Web發(fā)布目錄,默認(rèn)情況下把Web應(yīng)用文件放于此目錄/work:存放JSP編譯后產(chǎn)生的class文件27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放wi28目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題28目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體29應(yīng)用程序加載29應(yīng)用程序加載30JSP編譯的實(shí)現(xiàn)30JSP編譯的實(shí)現(xiàn)31Servlet管理—初始化在web應(yīng)用程序初始化過(guò)程中,也就是解析web.xml時(shí),會(huì)把Servlet、Filter、Listener等servlet對(duì)象實(shí)例化、初始化。每個(gè)Servlet被封裝為一個(gè)Wrapper,即StandardWrapper31Servlet管理—初始化在web應(yīng)用程序初始化過(guò)程中,32請(qǐng)求處理過(guò)程分析(1)32請(qǐng)求處理過(guò)程分析(1)33請(qǐng)求處理過(guò)程分析(2)33請(qǐng)求處理過(guò)程分析(2)34Session的創(chuàng)建和管理Catalina通過(guò)一個(gè)叫Manager的組件來(lái)完成session管理工作,即org.apache.catalina.Manager接口。一個(gè)Manager通常跟一個(gè)上下文容器相關(guān)聯(lián),它負(fù)責(zé)創(chuàng)建、更行以及銷(xiāo)毀session對(duì)象并能給任何請(qǐng)求組件返回一個(gè)合法的session。34Session的創(chuàng)建和管理Catalina通過(guò)一個(gè)叫Ma35Tomcat資源的管理(一)Tomcat資源:Tomcat中,可以使用server.xml和web.xml分別為應(yīng)用預(yù)定義一些靜態(tài)資源,這些靜態(tài)資源就是我們?cè)趹?yīng)用程序中可以直接訪問(wèn)的資源。這些資源在Tomcat啟動(dòng)的時(shí)候被自動(dòng)加載。35Tomcat資源的管理(一)Tomcat資源:36Tomcat資源的管理(二)server.xml定義資源server.xml中通過(guò)context來(lái)為應(yīng)用定義資源。資源定義包括五個(gè)元素:Parameter、Environment、Resource、ResourceParams、ResourceLink。Context中定義的資源只能被當(dāng)前的應(yīng)用使用。Server.xml中還可以定義GlobalNamingResource來(lái)定義全局的資源,元素包括:Environment、Resource、ResourceParams.元素名稱(chēng)說(shuō)明ParameterContext內(nèi),定義應(yīng)用參數(shù),通過(guò)ServletContext.getInitParameter()獲取Environment定義應(yīng)用的環(huán)境變量,通過(guò)JNDI查找Resource定義JNDI資源,通過(guò)JNDI查找資源,如:dataSourceResourceParams設(shè)置已定義的JNDI資源的參數(shù),按照名稱(chēng)與JNDI資源對(duì)應(yīng)ResourceLinkContext內(nèi),定義資源鏈接,將全局資源引入到本應(yīng)用中資源元素說(shuō)明:36Tomcat資源的管理(二)server.xml定義資源37Tomcat資源的管理(三)web.xml資源:這里說(shuō)的web.xml是各個(gè)應(yīng)用下自己的配置文件。包括元素:context-param、env-entry、resource-ref、resource-env-ref。元素名稱(chēng)說(shuō)明context-Parameter等價(jià)于server.xml中的parameter,會(huì)覆蓋server.xml中的同名參數(shù)。env-entry等價(jià)于server.xml中的Environment,會(huì)覆蓋server.xml中的同名變量resource-ref資源應(yīng)用定義??梢栽賡erver.xml中使用ResourceParams定義資源參數(shù),在web使用本元素進(jìn)行應(yīng)用resource-env-ref類(lèi)似resource-ref,沒(méi)有auth屬性,即不需要驗(yàn)證資源元素說(shuō)明:37Tomcat資源的管理(三)web.xml資源:元素名稱(chēng)38閥(Valve)的作用38閥(Valve)的作用39目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題39目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體40JVM參數(shù)配置setCATALINA_OPTS=-server-Xms1024m-Xmx1024m-XX:NewSize=512m-Xss128k-XX:PermSize=256M-XX:PermSize=256M或者setJAVA_OPTS也是一樣的40JVM參數(shù)配置41安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個(gè)節(jié)點(diǎn)之間進(jìn)行安全的通信。使用SSL機(jī)制的http協(xié)議也就是HTTPS協(xié)議。只有當(dāng)Tomcat作為獨(dú)立的web服務(wù)器時(shí),Tomcat中才有必要使用SSL,如果連接Apache、IIS等web服務(wù)器是,SSL需要在這些web服務(wù)器中進(jìn)行配置。這里簡(jiǎn)單說(shuō)一下配置SSL的必要步驟:使用keytool命令創(chuàng)建自簽名的數(shù)字證書(shū)。當(dāng)然這個(gè)證書(shū)是沒(méi)有被任何CA官方注冊(cè)的(具體配置可以參考資料);去掉server.xml中sslconnector元素的注釋?zhuān)蛊渖А?1安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個(gè)節(jié)點(diǎn)42安全相關(guān)配置--使用Valve加強(qiáng)安全性問(wèn)題:凡是允許用戶(hù)輸入數(shù)據(jù)到服務(wù)器都存在注入帶來(lái)的危險(xiǎn)。注入包括以下幾種:XSS(Cross-siteScript)注入如:<script>Document.location=“”+document.cookie;</script>HTML注入輸入框中插入惡意代碼,可以偷取用戶(hù)密碼等信息到自己的地址。SQL注入提交非法的查詢(xún)參數(shù),注入到查詢(xún)的sql字符串中,提取數(shù)據(jù)庫(kù)信息。命令注入發(fā)送請(qǐng)求命令道服務(wù)器中,該命令在命令行預(yù)先,偷取服務(wù)器信息。42安全相關(guān)配置--使用Valve加強(qiáng)安全性問(wèn)題:XSS(43安全相關(guān)配置--使用Valve加強(qiáng)安全性解決思路:使用Valve過(guò)濾用戶(hù)發(fā)送到服務(wù)器的數(shù)據(jù)。所有危害都是通過(guò)用戶(hù)提交的數(shù)據(jù)造成的,所有只要對(duì)用戶(hù)的數(shù)據(jù)進(jìn)行完全的過(guò)濾,就可以消除隱患。通過(guò)正則表達(dá)式進(jìn)行匹配查找和替換,參考:quoteHashMap.put(“\””,”"”);quoteHashMap.put(“\’”,”'”);quoteHashMap.put(“`”,”`”);angleBracketsHashMap.put(“<”,”<”);angleBracketsHashMap.put(“>”,”>”);javaScriptHashMap.put(“document(.*)\\.(.*)cookie”,”document.ccookie”);javaScriptHashMap.put(“eval(\\s)\\(”,”eval(”);等等43安全相關(guān)配置--使用Valve加強(qiáng)安全性解決思路:通過(guò)正44端口Tomcat使用的端口在使用Tomcat的過(guò)程中,經(jīng)常會(huì)有修改端口的情況,下面是幾個(gè)Tomcat需要注意的端口:端口說(shuō)明Server元素的8005用于監(jiān)聽(tīng)shutdown命令的端口,為提高安全性,應(yīng)修改這個(gè)端口,否則容易被通過(guò)telnet非法執(zhí)行shutdown命令HTTP/1.1的8080這個(gè)端口是最常被修改的,一般根據(jù)需要都應(yīng)修改,否則很容易被外界知道應(yīng)用服務(wù)器是TomcatAJP/1.3的8009連接器端口,如連接ApacheserverredirectPort的8443SSL端口號(hào),為了訪問(wèn)簡(jiǎn)便,一般修改為443,即SSL的默認(rèn)端口號(hào)44端口Tomcat使用的端口端口說(shuō)明Server元素的8045集群的配置幾個(gè)基本步驟:確保session中保存的對(duì)象實(shí)現(xiàn)java.io.Serivalizable接口;在server.xml文件里,去掉Cluster節(jié)點(diǎn)的注釋?zhuān)辉趕erver.xml中,去掉Valve(ReplicationValve)節(jié)點(diǎn)的注釋?zhuān)蝗绻麅蓚€(gè)以上Tomcat實(shí)例運(yùn)行在同一臺(tái)計(jì)算機(jī)上,確保各實(shí)例的tcpListenPort
屬性是不一樣的;…….負(fù)載平衡:Tomcat本身無(wú)法實(shí)現(xiàn)負(fù)載平衡,需要結(jié)合其他硬件設(shè)備或者軟件來(lái)實(shí)現(xiàn)。一般使用ApacheHTTPServer來(lái)做負(fù)載平衡管理器,這就需要mod_jk插件。45集群的配置幾個(gè)基本步驟:負(fù)載平衡:46常見(jiàn)問(wèn)題無(wú)法啟動(dòng):環(huán)境變量設(shè)置問(wèn)題,包括JAVA_HOME、CATALINA_HOME等;端口沖突,如:8080端口占用;多個(gè)Tomcat同時(shí)運(yùn)行;版本沖突,如:Tomcat5需要JDK1.5、Tomcat7需要JDK6;無(wú)法停止:應(yīng)用程序正在運(yùn)行或者正在被訪問(wèn)時(shí),Tomcat可能無(wú)法正常停止。當(dāng)然,如關(guān)閉命令行窗口也可以關(guān)掉;中文字符問(wèn)題:中文亂碼,一般可以通過(guò)在JSP的page標(biāo)簽中指定charset解決;如果是struts的Action或者Servlet亂碼,可以通過(guò)Filter設(shè)置編碼;應(yīng)用程序未啟動(dòng):
一般是由于應(yīng)用程序本身出現(xiàn)嚴(yán)重錯(cuò)誤(如配置文件錯(cuò)誤、重要的類(lèi)未找到等)導(dǎo)致,可以通過(guò)打開(kāi)日志,如Log4j進(jìn)行排查;46常見(jiàn)問(wèn)題無(wú)法啟動(dòng):無(wú)法停止:中文字符問(wèn)題:應(yīng)用程序未啟動(dòng)47通過(guò)對(duì)Tomcat分析,有什么好處?通過(guò)對(duì)Tomcat結(jié)構(gòu)和功能的理解和掌握,可以順利排除Tomcat及應(yīng)用程序出現(xiàn)的錯(cuò)誤和異常??梢?xún)?yōu)化其性能,甚至擴(kuò)展Tomcat的功能。通過(guò)對(duì)Tomcat源碼的分析,學(xué)習(xí)一些好的編程習(xí)慣,學(xué)習(xí)一些解決問(wèn)題的方法。了解Tomcat的設(shè)計(jì)模式可以參考Tomcat結(jié)構(gòu)和功能分析.doc47通過(guò)對(duì)Tomcat分析,有什么好處?通過(guò)對(duì)Tomcat結(jié)保密北京恒華偉業(yè)科技股份有限公司2012年09月Tomcat功能與架構(gòu)設(shè)計(jì)分析保密北京恒華偉業(yè)科技股份有限公司Tomcat功能與架構(gòu)設(shè)計(jì)49目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題2目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框50Java類(lèi)加載機(jī)制類(lèi)加載是java語(yǔ)言提供的最強(qiáng)大的機(jī)制之一。盡管類(lèi)加載并不是熱點(diǎn)話題,但作為編程人員都應(yīng)該了解其工作機(jī)制,明白怎樣去配合其工作。熟悉了類(lèi)加載機(jī)制可以使我們節(jié)省很多時(shí)間,而不必浪費(fèi)在調(diào)試ClassNotFoundException等異常上,且為我們開(kāi)發(fā)高擴(kuò)展性的應(yīng)用程序提供了一些思路。類(lèi)加載的作用:加載Java應(yīng)用程序所需的字節(jié)碼文件(*.class、*.jar);提供一種在運(yùn)行時(shí)動(dòng)態(tài)、靈活地定位資源(代碼和數(shù)據(jù))的方式;允許在運(yùn)行時(shí)利用多種不同資源創(chuàng)建應(yīng)用程序,并提供命名空間機(jī)制,使同一資源的多個(gè)版本在虛擬機(jī)上共存;可與安全體系結(jié)構(gòu)集成;提供在運(yùn)行時(shí)組裝應(yīng)用程序所需的服務(wù)。3Java類(lèi)加載機(jī)制類(lèi)加載是java語(yǔ)言提供的最強(qiáng)大的機(jī)制51Java類(lèi)加載器Java缺省使用如下三種類(lèi)型類(lèi)裝入器啟動(dòng)(Bootstrap)類(lèi)加載器:引導(dǎo)類(lèi)裝入器是用本地代碼實(shí)現(xiàn)的類(lèi)裝入器,它負(fù)責(zé)將<Java_Runtime_Home>/lib下面的類(lèi)庫(kù)加載到內(nèi)存中。由于引導(dǎo)類(lèi)加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)者無(wú)法直接獲取到啟動(dòng)類(lèi)加載器的引用,所以不允許直接通過(guò)引用進(jìn)行操作。標(biāo)準(zhǔn)擴(kuò)展(Extension)類(lèi)加載器:擴(kuò)展類(lèi)加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將<Java_Runtime_Home>/lib/ext或者由系統(tǒng)變量java.ext.dir指定位置中的類(lèi)庫(kù)加載到內(nèi)存中。開(kāi)發(fā)者可以直接使用標(biāo)準(zhǔn)擴(kuò)展類(lèi)加載器。系統(tǒng)(System)類(lèi)加載器:系統(tǒng)類(lèi)加載器是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)實(shí)現(xiàn)的。它負(fù)責(zé)將系統(tǒng)類(lèi)路徑(CLASSPATH)中指定的類(lèi)庫(kù)加載到內(nèi)存中。開(kāi)發(fā)者可以直接使用系統(tǒng)類(lèi)加載器。4Java類(lèi)加載器Java缺省使用如下三種類(lèi)型類(lèi)裝入器啟動(dòng)52類(lèi)加載器的委托機(jī)制1.首先判斷該類(lèi)型是否已經(jīng)被加載2.如果沒(méi)有被加載,就委托給父類(lèi)加載或者委派給啟動(dòng)類(lèi)加載器加載3.如果存在父類(lèi)加載器,就委派給父類(lèi)加載器加載4.如果不存在父類(lèi)加載器,就檢查是否是由啟動(dòng)類(lèi)加載器加載的類(lèi)5.如果父類(lèi)加載器和啟動(dòng)類(lèi)加載器都不能完成加載任務(wù),才調(diào)用自身的加載功能5類(lèi)加載器的委托機(jī)制1.首先判斷該類(lèi)型是否已經(jīng)被加載2.53Tomcat中類(lèi)加載器Common類(lèi)加載器負(fù)責(zé)加載TomcatHOME/common/class下的.Class文件和common/lib中的jar包,這些類(lèi)可以被Tomcat內(nèi)核和每個(gè)Web應(yīng)用程序都可以看見(jiàn),如servlet.jar等Catalina類(lèi)加載器從server/classes和server/lib下加載類(lèi),Catalina加載的類(lèi)只對(duì)Tomcat服務(wù)器內(nèi)核可見(jiàn),對(duì)Web應(yīng)用程序不可見(jiàn),對(duì)于運(yùn)行Tomcat內(nèi)核的線程,它的上下文類(lèi)加載器就是Catalina類(lèi)加載器Shared類(lèi)加載器負(fù)責(zé)從share/classes和share/lib中加載類(lèi),它加載的類(lèi)只對(duì)所有Web應(yīng)用程序有效,對(duì)Tomcat不可見(jiàn).WebappX類(lèi)加載器負(fù)責(zé)加載Web應(yīng)用程序的/web-INF/classes和lib目錄下的類(lèi),只對(duì)當(dāng)前Web應(yīng)用程序有效,對(duì)于運(yùn)行每個(gè)Web應(yīng)用程序的線程,他們的上下文類(lèi)加載器就是它們各自的WebappX類(lèi)加載器6Tomcat中類(lèi)加載器Common類(lèi)加載器負(fù)責(zé)加載Tomc54目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題7目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框55Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過(guò)相互作用,形成一個(gè)完善的有機(jī)體。8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過(guò)相互56Tomcat總體框架結(jié)構(gòu)分析Server
Server代表整個(gè)Catalinaservlet容器。在server.xml配置文件中必須是頂層元素且唯一,給它配置的屬性代表整個(gè)容器的屬性。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardServerListener
所有server.xml中的監(jiān)聽(tīng)器都實(shí)現(xiàn)了LifecycleListener接口。當(dāng)server中的各種組件在start、stop等事件發(fā)生時(shí)觸發(fā)相應(yīng)的操作。
如:JasperListener用來(lái)在所有web應(yīng)用程序啟動(dòng)前初始化jasper(JSP編譯)。9Tomcat總體框架結(jié)構(gòu)分析Server
57Tomcat總體框架結(jié)構(gòu)分析
Service
Service是這樣一個(gè)集合:它由一個(gè)或者多個(gè)Connector,以及一個(gè)共享的處理引擎(Engine)組成。Engine負(fù)責(zé)處理所有Connector所獲得的客戶(hù)請(qǐng)求。
默認(rèn)實(shí)現(xiàn):
org.apache.catalina.core.StandardService10Tomcat總體框架結(jié)構(gòu)分析
58Tomcat總體框架結(jié)構(gòu)分析Connector
一個(gè)連接器(Connector)將在某個(gè)指定端口上偵聽(tīng)客戶(hù)請(qǐng)求,并將獲得的請(qǐng)求交給Engine來(lái)處理,從Engine處獲得響應(yīng)結(jié)果,并返回給客戶(hù)端。
Tomcat有兩個(gè)典型的連接器,一個(gè)直接偵聽(tīng)來(lái)自客戶(hù)端瀏覽器的http請(qǐng)求,一個(gè)偵聽(tīng)來(lái)自其它Web服務(wù)器的請(qǐng)求。
11Tomcat總體框架結(jié)構(gòu)分析Connector
59Connector的工作原理CoyoteHttp/1.1Connector在端口8080處偵聽(tīng)來(lái)自客戶(hù)瀏覽器的http請(qǐng)求,CoyoteJK2Connector在端口8009處偵聽(tīng)來(lái)自其它Web服務(wù)器(比如Apache)的servlet/jsp代理請(qǐng)求。
當(dāng)使用CoyoteHttp/1.1Connector時(shí),Tomcat作為獨(dú)立的Web容器,同時(shí)扮演Web服務(wù)器和Servlet容器的雙重角色。當(dāng)使用CoyoteJK2Connector時(shí),Tomcat只扮演Servlet容器的角色,Web服務(wù)器則由Apache或者其他服務(wù)器來(lái)提供,由于這些專(zhuān)有的Web服務(wù)器在處理靜態(tài)資源的性能和效率上要比Tomcat提供的Web服務(wù)器要好,所以經(jīng)常將Tomcat和Apache配合使用。12Connector的工作原理Coyote60Tomcat總體框架結(jié)構(gòu)分析Engine
處理引擎(Engine)代表一個(gè)Service所屬的請(qǐng)求處理機(jī),它接受所有連接器傳遞過(guò)來(lái)的客戶(hù)端請(qǐng)求,將處理結(jié)果返回給連接器,由連接器將最終響應(yīng)返回給客戶(hù)端。Engine必須配置在Service組件下。
處理引擎下可以配置多個(gè)虛擬主機(jī)(VirtualHost),每個(gè)虛擬主機(jī)都有一個(gè)域名。當(dāng)處理引擎獲得一個(gè)請(qǐng)求時(shí),它把該請(qǐng)求匹配到某個(gè)虛擬主機(jī)上,把請(qǐng)求交給該虛擬主機(jī)來(lái)處理。處理引擎有一個(gè)默認(rèn)虛擬主機(jī),當(dāng)請(qǐng)求無(wú)法匹配到任何一個(gè)虛擬主機(jī)上時(shí),交給默認(rèn)虛擬主機(jī)來(lái)處理。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardEngine13Tomcat總體框架結(jié)構(gòu)分析Engine
61Tomcat總體框架結(jié)構(gòu)分析Host
代表一個(gè)虛擬主機(jī),每個(gè)虛擬主機(jī)和某個(gè)網(wǎng)絡(luò)域名(DomainName)相匹配。每個(gè)虛擬主機(jī)下都可以部署(deploy)一個(gè)或者多個(gè)Web應(yīng)用程序(WebApplication),每個(gè)Web應(yīng)用程序?qū)?yīng)于一個(gè)Context,有一個(gè)Contextpath。當(dāng)虛擬主機(jī)獲得一個(gè)請(qǐng)求時(shí),將把該請(qǐng)求匹配到某個(gè)Context上,然后把該請(qǐng)求交給該Context來(lái)處理。匹配的方法是“最長(zhǎng)匹配”,一個(gè)path=""的Context將成為該虛擬主機(jī)的默認(rèn)Context。所有無(wú)法和其它Context的路徑名匹配的請(qǐng)求都將最終和該默認(rèn)Context匹配。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardHost
14Tomcat總體框架結(jié)構(gòu)分析Host
代62Tomcat總體框架結(jié)構(gòu)分析Context
一個(gè)Context對(duì)應(yīng)于一個(gè)Web應(yīng)用程序,一個(gè)Web應(yīng)用程序由一個(gè)或者多個(gè)Servlet組成。Context在創(chuàng)建的時(shí)候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WebApp/Web-INF/web.xml載入Servlet類(lèi)。當(dāng)Context獲得請(qǐng)求時(shí),將在自己的映射表(mappingtable)中尋找相匹配的Servlet類(lèi)。如果找到,則執(zhí)行該類(lèi),獲得請(qǐng)求的響應(yīng),并返回。
默認(rèn)實(shí)現(xiàn):org.apache.catalina.core.StandardContext15Tomcat總體框架結(jié)構(gòu)分析Context
63Tomcat的核心類(lèi)圖所有的容器對(duì)象,都繼承LifeCycle,也即具有生命周期的方法,init(),start(),stop(),destroy(),具有LifecycleState屬性(可以看一下這個(gè)屬性的內(nèi)容)16Tomcat的核心類(lèi)圖所有的容器對(duì)象,都繼承LifeCy64Tomcat總體框架結(jié)構(gòu)分析—啟動(dòng)catalina.bat中setMAINCLASS=org.apache.catalina.startup.Bootstrap17Tomcat總體框架結(jié)構(gòu)分析—啟動(dòng)catalina.ba65Tomcat組件啟動(dòng)流程圖18Tomcat組件啟動(dòng)流程圖66啟動(dòng)過(guò)程都做了什么1.初始化目錄
設(shè)置CatalinaHome、CatalinaBase,初始化System環(huán)境信息2.初始化類(lèi)加載器(ClassLoader)
初始化三個(gè)類(lèi)加載器commonLoader、catalinaLoader、sharedLoader;這是要從perties中讀取配置,即jar包的配置。3.構(gòu)建容器
對(duì)server、service、engine、host等容器對(duì)象進(jìn)行實(shí)例化,開(kāi)始這些對(duì)象的生命周期。4.部署Web應(yīng)用
掃描webapps、conf/Catalina/localhost目錄,進(jìn)行war包、應(yīng)用程序目錄、contex配置文件的加載;19啟動(dòng)過(guò)程都做了什么1.初始化目錄2.初始化類(lèi)加載器(67Tomcat嵌入早期版本中,如Tomcat5中,提供了Embedded類(lèi)用于在java應(yīng)用中嵌入。在新版本的Tomcat中,Embedded已經(jīng)不建議使用。Tomcat7中,提供了專(zhuān)門(mén)的Embedded版本。當(dāng)然,我們可以直接構(gòu)建Catalina對(duì)象實(shí)現(xiàn)Tomcat的嵌入應(yīng)用;也可以參考或者直接改造Bootstrap類(lèi)實(shí)現(xiàn)嵌入。20Tomcat嵌入早期版本中,如Tomcat5中,提供了E68Tomcat容器的結(jié)構(gòu)21Tomcat容器的結(jié)構(gòu)69容器的工作原理
1.ClassLoaerTomcat通過(guò)WebappClassLoader加載web應(yīng)用程序,通過(guò)WebappClassLoader確保各個(gè)應(yīng)用相互獨(dú)立,運(yùn)行期間互不干擾。
2.容器生命周期
應(yīng)用LifeCycle生命周期接口定義各級(jí)容器的初始化、啟動(dòng)、停止、銷(xiāo)毀等動(dòng)作,并應(yīng)用組合設(shè)計(jì)模式把Server、Service、Engine、Host、Context這幾級(jí)容器有效的整合為有機(jī)體,協(xié)調(diào)完成JSP解析、編譯、初始化以及響應(yīng)客戶(hù)端請(qǐng)求等這種任務(wù)。
3.Connector
容器接收Connector傳遞過(guò)來(lái)的客戶(hù)端(瀏覽器或者webserver)請(qǐng)求,并把響應(yīng)結(jié)果通過(guò)Connector發(fā)回到客戶(hù)端(瀏覽器)。22容器的工作原理1.ClassLoaer70目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題23目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體71Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache.catalinaTomcat核心類(lèi)庫(kù),規(guī)范了Tomcat的總體架構(gòu),定義了Server、Service、Host、Connector、Context、Session及Cluster等關(guān)鍵組件及這些組件的實(shí)現(xiàn),這個(gè)子模塊大量運(yùn)用了Composite設(shè)計(jì)模式。同時(shí)也規(guī)范了Catalina的啟動(dòng)及停止等事件的執(zhí)行流程
org.apache.coyoteCoyote連接器,實(shí)現(xiàn)了Http1.1協(xié)議,實(shí)現(xiàn)了對(duì)請(qǐng)求和響應(yīng)對(duì)象的構(gòu)建。24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache72Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache下其他包el
:
el表達(dá)式定義、解析處理jasper:
負(fù)責(zé)jsp頁(yè)面的解析,jsp屬性的驗(yàn)證,同時(shí)也負(fù)責(zé)將jsp頁(yè)面
動(dòng)態(tài)轉(zhuǎn)換為java代碼并編譯成class文件juli:
日志管理naming:
資源管理,包括數(shù)據(jù)庫(kù)連接池、EJB、mail等通過(guò)JNDI獲取的
內(nèi)容25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache73Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.servlet
Servlet和Jsp規(guī)范的實(shí)現(xiàn)模塊,我們非常熟悉的javax.servlet.Servlet接口、javax.servet.http.HttpServlet類(lèi)及javax.servlet.jsp.HttpJspPage就位于這個(gè)子模塊中;26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.serv74Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放windows或Linux平臺(tái)上啟動(dòng)和關(guān)閉Tomcat的腳本文件/conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml/doc:存放Tomcat文檔【下面這幾個(gè)目錄在Tomcat6、7中已經(jīng)去掉,合并為lib目錄】/server:包含三個(gè)子目錄:classes、lib和webapps/server/lib:存放Tomcat服務(wù)器所需的各種JAR文件/server/webapps:存放Tomcat自帶的兩個(gè)WEB應(yīng)用admin應(yīng)用和manager應(yīng)用/common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問(wèn)的jar文件/shared/lib:存放所有web應(yīng)用都可以訪問(wèn)的jar文件(但是不能被Tomcat服務(wù)器訪問(wèn))/logs:存放Tomcat執(zhí)行時(shí)的日志文件/webapps:Tomcat的主要Web發(fā)布目錄,默認(rèn)情況下把Web應(yīng)用文件放于此目錄/work:存放JSP編譯后產(chǎn)生的class文件27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放wi75目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題28目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體76應(yīng)用程序加載29應(yīng)用程序加載77JSP編譯的實(shí)現(xiàn)30JSP編譯的實(shí)現(xiàn)78Servlet管理—初始化在web應(yīng)用程序初始化過(guò)程中,也就是解析web.xml時(shí),會(huì)把Servlet、Filter、Listener等servlet對(duì)象實(shí)例化、初始化。每個(gè)Servlet被封裝為一個(gè)Wrapper,即StandardWrapper31Servlet管理—初始化在web應(yīng)用程序初始化過(guò)程中,79請(qǐng)求處理過(guò)程分析(1)32請(qǐng)求處理過(guò)程分析(1)80請(qǐng)求處理過(guò)程分析(2)33請(qǐng)求處理過(guò)程分析(2)81Session的創(chuàng)建和管理Catalina通過(guò)一個(gè)叫Manager的組件來(lái)完成session管理工作,即org.apache.catalina.Manager接口。一個(gè)Manager通常跟一個(gè)上下文容器相關(guān)聯(lián),它負(fù)責(zé)創(chuàng)建、更行以及銷(xiāo)毀session對(duì)象并能給任何請(qǐng)求組件返回一個(gè)合法的session。34Session的創(chuàng)建和管理Catalina通過(guò)一個(gè)叫Ma82Tomcat資源的管理(一)Tomcat資源:Tomcat中,可以使用server.xml和web.xml分別為應(yīng)用預(yù)定義一些靜態(tài)資源,這些靜態(tài)資源就是我們?cè)趹?yīng)用程序中可以直接訪問(wèn)的資源。這些資源在Tomcat啟動(dòng)的時(shí)候被自動(dòng)加載。35Tomcat資源的管理(一)Tomcat資源:83Tomcat資源的管理(二)server.xml定義資源server.xml中通過(guò)context來(lái)為應(yīng)用定義資源。資源定義包括五個(gè)元素:Parameter、Environment、Resource、ResourceParams、ResourceLink。Context中定義的資源只能被當(dāng)前的應(yīng)用使用。Server.xml中還可以定義GlobalNamingResource來(lái)定義全局的資源,元素包括:Environment、Resource、ResourceParams.元素名稱(chēng)說(shuō)明ParameterContext內(nèi),定義應(yīng)用參數(shù),通過(guò)ServletContext.getInitParameter()獲取Environment定義應(yīng)用的環(huán)境變量,通過(guò)JNDI查找Resource定義JNDI資源,通過(guò)JNDI查找資源,如:dataSourceResourceParams設(shè)置已定義的JNDI資源的參數(shù),按照名稱(chēng)與JNDI資源對(duì)應(yīng)ResourceLinkContext內(nèi),定義資源鏈接,將全局資源引入到本應(yīng)用中資源元素說(shuō)明:36Tomcat資源的管理(二)server.xml定義資源84Tomcat資源的管理(三)web.xml資源:這里說(shuō)的web.xml是各個(gè)應(yīng)用下自己的配置文件。包括元素:context-param、env-entry、resource-ref、resource-env-ref。元素名稱(chēng)說(shuō)明context-Parameter等價(jià)于server.xml中的parameter,會(huì)覆蓋server.xml中的同名參數(shù)。env-entry等價(jià)于server.xml中的Environment,會(huì)覆蓋server.xml中的同名變量resource-ref資源應(yīng)用定義。可以再server.xml中使用ResourceParams定義資源參數(shù),在web使用本元素進(jìn)行應(yīng)用resource-env-ref類(lèi)似resource-ref,沒(méi)有auth屬性,即不需要驗(yàn)證資源元素說(shuō)明:37Tomcat資源的管理(三)web.xml資源:元素名稱(chēng)85閥(Valve)的作用38閥(Valve)的作用86目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計(jì)分析6.實(shí)用配置與常見(jiàn)問(wèn)題39目錄1.Java類(lèi)加載機(jī)制2.Tomcat總體87JVM參數(shù)配置setCATALINA_OPTS=-server-Xms1024m-Xmx1024m-XX:NewSize=512m-Xss128k-XX:PermSize=256M-XX:PermSize=256M或者setJAVA_OPTS也是一樣的40JVM參數(shù)配置88安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個(gè)節(jié)點(diǎn)之間進(jìn)行安
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年江蘇食品藥品職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試參考題庫(kù)含詳細(xì)答案解析
- 2026年安徽財(cái)貿(mào)職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)筆試備考題庫(kù)含詳細(xì)答案解析
- 2026年赤峰工業(yè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試模擬試題及答案詳細(xì)解析
- 2026廣西南寧市興寧區(qū)金川路小學(xué)教師招聘1人參考考試試題及答案解析
- 2026年贛西科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年阿壩職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 2026年邢臺(tái)醫(yī)學(xué)高等專(zhuān)科學(xué)校單招綜合素質(zhì)考試備考試題含詳細(xì)答案解析
- 2026年江蘇工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年湖南工商職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試模擬試題及答案詳細(xì)解析
- 2026年山東司法警官職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試備考題庫(kù)含詳細(xì)答案解析
- 學(xué)校桌椅采購(gòu)項(xiàng)目質(zhì)量保障方案
- 高考英語(yǔ)讀后續(xù)寫(xiě)片段小練習(xí)(中英對(duì)照+模板套用)
- 嘉賓邀請(qǐng)合同書(shū)
- 華電集團(tuán)企業(yè)介紹
- 2025年AI時(shí)代的技能伙伴報(bào)告:智能體、機(jī)器人與我們(英文版)
- 消除艾滋病、梅毒和乙肝母嬰傳播鄉(xiāng)村醫(yī)生培訓(xùn)會(huì)-課件
- 2025年城市更新改造項(xiàng)目經(jīng)濟(jì)效益評(píng)估可行性研究報(bào)告
- 消防知識(shí)培訓(xùn)錦旗課件
- 新媒體與藝術(shù)教育-藝術(shù)教育中的新媒體技術(shù)
- 中醫(yī)醫(yī)院針灸進(jìn)修總結(jié)
- 主動(dòng)脈瘤護(hù)理查房
評(píng)論
0/150
提交評(píng)論