1、tomcat目錄中重要的文件:html
bin 存放啓動和關閉的腳本java
conf 存放配置文件web
logs 日誌文件算法
webapps 存放部署的項目apache
work 工做目錄windows
Web應用開發好後,若想供外界訪問,須要把web應用所在目錄交給web服務器管理,這個過程稱之爲虛似目錄的映射瀏覽器
Web應用開發好後,若想供外界訪問,須要把web應用所在目錄交給web服務器管理,這個過程稱之爲虛似目錄的映射。那麼在Tomcat服務器中,如何進行虛擬目錄的映射呢?總共有以下的幾種方式:tomcat
找到server.xml文件的host元素,以下圖所示:安全
在<Host></Host>這對標籤加上<Context path="/JavaWebApp" docBase="F:\JavaWebDemoProject" />便可將在F盤下的JavaWebDemoProject這個JavaWeb應用映射到JavaWebApp這個虛擬目錄上,JavaWebApp這個虛擬目錄是由Tomcat服務器管理的,JavaWebApp是一個硬盤上不存在的目錄,是咱們本身隨便寫的一個目錄,也就是虛擬的一個目錄,因此稱之爲"虛擬目錄",代碼以下:服務器
1 <Host name="localhost" appBase="webapps" 2 unpackWARs="true" autoDeploy="true" 3 xmlValidation="false" xmlNamespaceAware="false"> 4 5 <Context path="/JavaWebApp" docBase="F:\JavaWebDemoProject" /> 6 </Host>
其中,Context表示上下文,表明的就是一個JavaWeb應用,Context元素有兩個屬性,
Ⅰ.path:用來配置虛似目錄,必須以"/"開頭。
Ⅱ.docBase:配置此虛似目錄對應着硬盤上的Web應用所在目錄。
使用瀏覽器訪問"/JavaWebApp"這個虛擬目錄下的1.jsp這個web資源,訪問結果以下:
1.jsp能夠正常訪問,這說明咱們已經成功地將將在F盤下的JavaWebDemoProject這個JavaWeb應用映射到JavaWebApp這個虛擬目錄上了,訪問"/JavaWebApp/1.jsp"就至關於訪問"F:\JavaWebDemoProject\1.jsp"
注意:在Tomcat6以後中,再也不建議在server.xml文件中使用配置context元素的方式來添加虛擬目錄的映射,由於每次修改server.xml文件後,Tomcat服務器就必需要從新啓動後才能從新加載server.xml文件。在Tomcat服務器的文檔http://localhost:8080/docs/config/context.html中有這樣的說明:
It is NOT recommended to place <Context> elements directly in the server.xml file. This is because it makes modifying the Context configuration more invasive since the main conf/server.xml
file cannot be reloaded without restarting Tomcat.
Individual Context elements may be explicitly defined:
/META-INF/context.xml
inside the application files. Optionally (based on the Host's copyXML attribute) this may be copied to $CATALINA_BASE/conf/[enginename]/[hostname]/
and renamed to application's base file name plus a ".xml" extension.$CATALINA_BASE/conf/[enginename]/[hostname]/
directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application's META-INF directory.conf/server.xml
.tomcat服務器會自動管理webapps目錄下的全部web應用,並把它映射成虛似目錄。換句話說,tomcat服務器webapps目錄中的web應用,外界能夠直接訪問。
例如:把F盤下的JavaWebDemoProject這個JavaWeb應用直接copy到tomcat服務器webapps目錄中,以下圖所示:
此時Tomcat服務器就會自動爲JavaWebDemoProject這個JavaWeb應用映射一個同名的虛擬目錄"/JavaWebDemoProject",而後就可使用瀏覽器訪問這個JavaWeb應用的資源了,以下圖所示:
參考Tomcat服務器文檔:
In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/
directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application's META-INF directory.
意思就是:在tomcat服務器的\conf\Catalina\localhost目錄下添加一個以xml做爲擴展名的文件,xml文件的名字能夠任意取,好比下面的aa.xml,注意這一句話"The context path and version will be derived from the base name of the file",這一句話的意思翻譯過來就是"context元素的path屬性源自因而這個xml文件的名字",上面提到過,Context元素的path屬性是用來配置虛似目錄的名稱的,因此虛似目錄的名稱就是這個xml文件的名稱。
$CATALINA_BASE
指的就是tomcat服務器根目錄,[enginename]
指的是Tomcat服務器使用的引擎名稱,Tomcat使用的引擎是Catalina
在aa.xml文件中添加Context元素映射JavaWeb應用,代碼以下:
1 <Context docBase="F:\JavaWebDemoProject" />
注意:在Context元素中並無指明path屬性來設置虛擬目錄的名稱,那麼"F:\JavaWebDemoProject"映射的虛擬目錄名稱是神馬呢,就是當前正在編輯的這個xml文件的名稱aa。
使用這種方式映射虛擬目錄的最大好處是修改了配置文件後不用重啓Tomcat服務器,好比將aa.xml修改爲bb.xml,Tomcat服務器會自動Undeploying context [/aa],而後自動信息: Deploying configuration descriptor D:\apache-tomcat-7.0.53\conf\Catalina\localhost\bb.xml
配置虛似主機就是配置一個網站。
在Tomcat服務器配置一個虛擬主機(網站),須要修改conf文件夾下的server.xml這個配置文件,使用Host元素進行配置,打開server.xml,能夠看到Tomcat服務器自帶的一個名稱爲localhost的虛擬主機(網站),以下圖所示:
平時咱們將開發好的JavaWeb應用放到webapps文件夾下,而後就可使用"http://localhost:端口號/JavaWebAppName"的方式去訪問了,其實訪問的就是name是"localhost"的那臺虛擬主機(Host),這臺虛擬主機管理webapps文件夾下的全部web應用。
例如:http://localhost:8080/JavaWebDemoProject/1.jsp,這個URL地址訪問的就是名稱是localhost的那臺虛擬主機下的JavaWebDemoProject這個應用裏面的1.jsp這個web資源。
咱們可使用以下的方式配置一個虛擬主機,例如:
1 <Host name="www.gacl.cn" appBase="F:\JavaWebApps"> 2 3 </Host>
這裏咱們新配置一個虛擬主機,虛擬主機的name是"www.gacl.cn",虛擬主機"www.gacl.cn"如今管理着JavaWebApps文件夾下的全部web應用,平時咱們在互聯網上使用域名"www.baidu.com"訪問百度的網站時,其實就是在訪問一個名稱是"www.baidu.com"的虛擬主機,因此當咱們要訪問name是"www.gacl.cn"的這個虛擬主機時,就可使用"域名(www.gacl.cn)"去訪問,注意一下appBase="F:\JavaWebApps",這裏的JavaWebApps文件夾表明的不是一個項目的根目錄,而是一個存放了一個或者多個JavaWeb應用的文件夾,以下圖所示:
就好像是Tomcat服務器的webapps文件夾同樣,裏面存放了不少的JavaWeb應用
配置的主機(網站)要想經過域名被外部訪問,必須在DNS服務器或windows系統中註冊訪問網站時使用的域名,找到"C:\Windows\System32\drivers\etc"目錄下的hosts文件,以下圖所示:
編輯這個文件,將新添加的網站的域名和IP地址綁定在一塊兒,這樣咱們就能夠在瀏覽器中使用www.gacl.cn這個域名去訪問name是www.gacl.cn那個虛擬主機裏面管理的那些web應用了
使用瀏覽器經過域名"www.gacl.cn"訪問"www.gacl.cn"這個虛擬主機下的JavaWebDemo1這個web應用下的1.jsp這個web資源,"www.gacl.cn"這個虛擬主機開放了一個8080端口,用戶只能經過這個8080端口去訪問JavaWebDemo1這個web應用下的1.jsp這個web資源
當咱們打開瀏覽器,在瀏覽器的地址欄中輸入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去訪問服務器上的1.jsp這個web資源的過程當中,瀏覽器和服務器都作了神馬操做呢,咱們是怎麼在瀏覽器裏面看到1.jsp這個web資源裏面的內容的呢?
瀏覽器和服務器作了如下幾個操做:
一、瀏覽器根據主機名"www.gacl.cn"去操做系統的Hosts文件中查找主機名對應的IP地址。
二、瀏覽器若是在操做系統的Hosts文件中沒有找到對應的IP地址,就去互聯網上的DNS服務器上查找"www.gacl.cn"這臺主機對應的IP地址。
三、瀏覽器查找到"www.gacl.cn"這臺主機對應的IP地址後,就使用IP地址鏈接到Web服務器。
四、瀏覽器鏈接到web服務器後,就使用http協議向服務器發送請求,發送請求的過程當中,瀏覽器會向Web服務器以Stream(流)的形式傳輸數據,告訴Web服務器要訪問服務器裏面的哪一個Web應用下的Web資源,以下圖所示:
這就是瀏覽器向Web服務器發請求時向服務器傳輸的數據,解釋一下"GET /JavaWebDemo1/1.jsp HTTP/1.1"這裏面的內容,
GET:告訴Web服務器,瀏覽器是以GET的方式向服務器發請求。
/JavaWebDemo1/1.jsp:告訴Web服務器,瀏覽器要訪問JavaWebDemo1應用裏面的1.jsp這個Web資源。
HTTP/1.1:告訴Web服務器,瀏覽器是以HTTP協議請求的,使用的是1.1的版本。
五、瀏覽器作完上面4步工做後,就開始等待,等待Web服務器把本身想要訪問的1.jsp這個Web資源傳輸給它。
六、服務器接收到瀏覽器傳輸的數據後,開始解析接收到的數據,服務器解析"GET /JavaWebDemo1/1.jsp HTTP/1.1"裏面的內容時知道客戶端瀏覽器要訪問的是JavaWebDemo1應用裏面的1.jsp這個Web資源,而後服務器就去讀取1.jsp這個Web資源裏面的內容,將讀到的內容再以Stream(流)的形式傳輸給瀏覽器,以下圖所示:
這個就是Web服務器傳輸給瀏覽器的數據。
七、瀏覽器拿到服務器傳輸給它的數據以後,就能夠把數據展示給用戶看了,以下圖所示:
看到的這個"JavaWebDemo1"就是瀏覽器解析服務器發送回來的數據後的效果
服務器發送回來的數據:
1 HTTP/1.1 200 OK 2 Server: Apache-Coyote/1.1 3 Content-Type: text/html;charset=ISO-8859-1 4 Content-Length: 102 5 Date: Mon, 19 May 2014 14:25:14 GMT 6 7 <html> 8 <head> 9 <title>JavaWebDemo1</title> 10 </head> 11 <body> 12 JavaWebDemo1 13 14 </body> 15 </html>
這就是瀏覽器和服務器的交互過程。
開發JavaWeb應用時,不一樣類型的文件有嚴格的存放規則,不然不只可能會使web應用沒法訪問,還會致使web服務器啓動報錯
WebRoot →Web應用所在目錄,通常狀況下虛擬目錄要配置到此文件夾當中。
┝WEB-INF:此文件夾必須位於WebRoot文件夾裏面,並且必須以這樣的形式去命名,字母都要大寫。
┝web.xml:配置文件,有格式要求,此文件必須以這樣的形式去命名,而且必須放置到WEB-INF文件夾中。
web.xml的格式能夠直接從Tomcat中參考獲得:找到Tomcat目錄下的webapps\ROOT\WEB-INF這個目錄下的web.xml文件,把這個文件拷貝到咱們新建的WEB-INF文件夾中,並修改這個web.xml文件,把裏面的註釋刪除掉,只留下以下所示的代碼便可:
web.xml :
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 version="2.5"> 6 7 <display-name>Welcome to Tomcat</display-name> 8 <description> 9 Welcome to Tomcat 10 </description> 11 12 </web-app>
這就是web.xml這個文件的格式
關於https的講解
在Java中,使用"jar"命令來對將JavaWeb應用打包成一個War包,jar命令的用法以下:
範例:將JavaWebDemoProject這個JavaWeb應用打包成war包
執行完以後,就能夠獲得一個文件,平時開發完JavaWeb應用後,通常都會將JavaWeb應用打包成一個war包,而後將這個war包放到Tomcat服務器的webapps目錄下,當Tomcat服務器啓動時,就會自動將webapps目錄下的war包解壓。
好比如今將放到放到Tomcat服務器的webapps目錄下
Tomcat服務器啓動後會自動"Deploying web application",將這個war文件解壓縮,以下圖所示:
Tomcat服務器的啓動是基於一個server.xml文件的,Tomcat啓動的時候首先會啓動一個Server,Server裏面就會啓動Service,Service裏面就會啓動多個"Connector(鏈接器)",每個鏈接器都在等待客戶機的鏈接,當有用戶使用瀏覽器去訪問服務器上面的web資源時,首先是鏈接到Connector(鏈接器),Connector(鏈接器)是不處理用戶的請求的,而是將用戶的請求交給一個Engine(引擎)去處理,Engine(引擎)接收到請求後就會解析用戶想要訪問的Host,而後將請求交給相應的Host,Host收到請求後就會解析出用戶想要訪問這個Host下面的哪個Web應用,一個web應用對應一個Context。
1 <?xml version='1.0' encoding='utf-8'?> 2 <Server port="8005" shutdown="SHUTDOWN"> 3 <Service name="Catalina"> 4 <Connector port="8080" protocol="HTTP/1.1" 5 connectionTimeout="20000" 6 redirectPort="8443" /> 7 <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" 8 maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 9 clientAuth="false" sslProtocol="TLS" 10 keystoreFile="conf/.keystore" keystorePass="123456"/> 11 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 12 <Engine name="Catalina" defaultHost="localhost"> 13 14 <Host name="localhost" appBase="webapps" 15 unpackWARs="true" autoDeploy="true"> 16 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 17 prefix="localhost_access_log." suffix=".txt" 18 pattern="%h %l %u %t "%r" %s %b" /> 19 </Host> 20 <Host name="www.gacl.cn" appBase="F:\JavaWebApps"> 21 <Context path="" docBase="F:\JavaWebApps\JavaWebDemo1"/> 22 </Host> 23 24 </Engine> 25 </Service> 26 </Server>
Tomcat服務器啓動時候會啓動多個Connector(鏈接器),而Tomcat服務器的鏈接器又分爲加密鏈接器和非加密連機器,好比:
這裏訪問的就是使用8080端口的那個鏈接器
1 <Connector port="8080" protocol="HTTP/1.1" 2 connectionTimeout="20000" 3 redirectPort="8443" />
這個Connector是一個沒有加密的鏈接器,使用"http://localhost:8080/JavaWebDemoProject/Web/1.jsp"去請求服務器上的web資源的這個過程當中,咱們的請求是不加密的,要是想以一種加密的方式來訪問Tomcat服務器,那麼就要在Tomcat裏面配置一個加密的Connector。要配置一個加密鏈接器,首先應該把互聯網上的加密原理弄清楚。
非對稱加密算法須要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法。 非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把做爲公用密鑰向其它方公開;獲得該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用本身保存的另外一把專用密鑰對加密後的信息進行解密。另外一方面,甲方可使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用本身的私匙對數據進行驗籤。
發送方使用接收方的公鑰對數據加密,而接收方則使用本身的私鑰解密,這樣,信息就能夠安全無誤地到達目的地了,即便被第三方截獲,因爲沒有相應的私鑰,也沒法進行解密。經過數字的手段保證加密過程是一個不可逆過程,即只有用私有密鑰才能解密。
非對稱性加密依然沒有解決數據傳輸的安全性問題,好比A想向B發數據,B首先生成一對密鑰(公鑰和私鑰),而後將公鑰發給A,A拿到B發給他的公鑰有就可使用公鑰加密數據後發給B,然而在B公鑰發送給A的這個過程當中,頗有可能會被第三方C截獲,C截獲到B的公鑰後,也使用B的公鑰加密數據,而後發給B,B接收到數據後就暈了,由於搞不清楚接收到的數據究竟是A發的仍是C發的,這是其中一個問題,另外一個問題就是,C截獲到B發的公鑰後,C能夠本身生成一對密鑰(公鑰和私鑰),而後發給A,A拿到公鑰後就覺得是B發給他的,而後就使用公鑰加密數據發給B,發送給B的過程當中被C截獲下來,因爲A是用C發給他的公鑰加密數據的,而C有私鑰,所以就能夠解密A加密事後的內容了,而B接收到A發給他的數據後反而解不開了,由於數據是用C的公鑰加密的,B沒有C的私鑰,因此就沒法解密。因此,非對稱性加密存在一個問題:A想向B發數據,A如何肯定拿到的公鑰必定是B發的呢?那麼如何解決這個問題呢?只能靠一個第三方機構(CA機構,即證書受權中心(Certificate Authority ),或稱證書受權機構)來擔保。A想向B發數據,B首先將公鑰發給CA機構,CA機構拿到B的公鑰後跑到B的家裏問:這是你發的公鑰嗎?B確認事後說是:沒錯,是我發的!那麼此時CA機構就會爲B的公鑰作擔保,生成一份數字證書給B,數字證書包含了CA的擔保認證簽名和B的公鑰,B拿到CA的這份數字證書後,就發給A,A拿到數字證書後,看到上面有CA的簽名,就能夠肯定當前拿到的公鑰是B發的,那麼就能夠放心大膽地使用公鑰加密數據,而後發給B了。
明白了互聯網上的加密原理以後,下面來看看瀏覽器與服務器交互時,瀏覽器想將數據加密後再發送給服務器,那麼該怎麼作呢?服務器首先要向瀏覽器出示一份數字證書,瀏覽器看到數字證書後,就可使用數字證書裏面的公鑰加密數據,因此要想作瀏覽器和服務器的加密數據傳輸,那麼首先得針對服務器生成一份數字證書。而後再配置一下服務器,讓服務器收到瀏覽器的請求以後,會向瀏覽器出示它的數字證書。
SUN公司提供了製做證書的工具keytool, 在JDK 1.4之後的版本中都包含了這一工具,它的位置爲<JAVA_HOME>\bin\keytool.exe
1 keytool -genkey -alias tomcat -keyalg RSA
使用keytool生成一個名字爲tomcat的證書,存放在.keystore這個密鑰庫中
命令執行完以後,操做系統的用戶文件夾下面就會生成一個.keystore文件,以下圖所示:
使用命令:keytool -list -keystore .keystore查看.keystore密鑰庫裏面的全部證書
將生成的.keystore密鑰庫文件拷貝到Tomcat服務器的conf目錄下,以下圖所示:
修改server.xml文件,配置https鏈接器,代碼以下:
1 <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" 2 maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 3 clientAuth="false" sslProtocol="TLS" 4 keystoreFile="conf/.keystore" keystorePass="123456"/>
在server.xml文件中配置了一個端口是8443的加密鏈接器,瀏覽器訪問8443端口的鏈接器時,將會以加密的方式來訪問web服務器,這個鏈接器收到瀏覽器的請求後,將會向瀏覽器出示一份數字證書,瀏覽器再用數字證書裏面的公鑰來加密數據,keystoreFile="conf/.keystore" 用來指明密鑰庫文件的所在路徑,服務器從密鑰庫中提取證書時須要密碼,keystorePass="123456"指明密鑰庫的訪問密碼。
使用"https://localhost:8443/"訪問8443的加密鏈接器
因爲密鑰庫裏面的證書是咱們手工生成的,沒有通過CA的認證,因此使用"https://localhost:8443/"訪問8443的加密鏈接器,瀏覽器會出現"證書錯誤,導航已阻止",瀏覽器認爲當前要訪問的這個主機是不安全的,不推薦繼續訪問,點擊就能夠繼續訪問了,以下圖所示:
爲了讓瀏覽器信任咱們生成的數字證書,須要將數字證書安裝到瀏覽器中,以IE8瀏覽器爲例進行證書安裝說明,安裝步驟以下:
證書安裝成功後,重啓IE瀏覽器,使用"https://localhost:8443/"訪問8443的加密鏈接器,此時瀏覽器就再也不提示證書錯誤了,以下圖所示:
以IE8爲例進行說明,操做步驟以下:工具----->Internet選項
刪除以後重啓瀏覽器便可