Tomcat部署Java War包應用教程
一、打包JavaWeb應用
在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的體系結構
Tomcat伺服器的啟動是基於一個server.xml檔案的,Tomcat啟動的時候首先會啟動一個Server,Server裡面就會啟動Service,Service裡面就會啟動多個"Connector(聯結器)",每一個聯結器都在等待客戶機的連線,當有使用者使用瀏覽器去訪問伺服器上面的web資源時,首先是連線到Connector(聯結器),Connector(聯結器)是不處理使用者的請求的,而是將使用者的請求交給一個Engine(引擎)去處理,Engine(引擎)接收到請求後就會解析使用者想要訪問的Host,然後將請求交給相應的Host,Host收到請求後就會解析出使用者想要訪問這個Host下面的哪一個Web應用,一個web應用對應一個Context。
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="123456"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"><span style="color:rgb(0,0,255);line-height:1.5;"><</span><span style="color:rgb(128,0,0);line-height:1.5;">Host </span><span style="color:rgb(255,0,0);line-height:1.5;">name</span><span style="color:rgb(0,0,255);line-height:1.5;">="localhost"</span><span style="color:rgb(255,0,0);line-height:1.5;"> appBase</span><span style="color:rgb(0,0,255);line-height:1.5;">="webapps"</span>
unpackWARs=“true” autoDeploy=“true”>
<Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs”
prefix=“localhost_access_log.” suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name=“www.gacl.cn” appBase=“F:\JavaWebApps”>
<Context path="" docBase=“F:\JavaWebApps\JavaWebDemo1”/>
</Host>
</Engine>
</Service>
</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。要配置一個加密聯結器,首先應該把網際網路上的加密原理弄清楚。
3.1、對稱加密
採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 需要對加密和解密使用相同金鑰的加密演算法。由於其速度快,對稱性加密通常在訊息傳送方需要加密大量資料時使用。對稱性加密也稱為金鑰加密。 所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的金鑰進行加密和解密。金鑰是控制加密及解密過程的指令。演算法是一組規則,規定如何進行加密和解密。 加密的安全性不僅取決於加密演算法本身,金鑰管理的安全性更是重要。因為加密和解密都使用同一個金鑰,如何把金鑰安全地傳遞到解密者手上就成了必須要解決的問題。 常用的對稱加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES演算法等3.2、非對稱加密
非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。 非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公用金鑰向其它方公開;得到該公用金鑰的乙方使用該金鑰對機密資訊進行加密後再發送給甲方;甲方再用自己儲存的另一把專用金鑰對加密後的資訊進行解密。另一方面,甲方可以使用乙方的公鑰對機密資訊進行簽名後再發送給乙方;乙方再用自己的私匙對資料進行驗籤。
非對稱加密工作原理
1.A要向B傳送資訊,A和B都要產生一對用於加密和解密的公鑰和私鑰。 2.A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。 3.A要給B傳送資訊時,A用B的公鑰加密資訊,因為A知道B的公鑰。 4.A將這個訊息發給B(已經用B的公鑰加密訊息)。 5.B收到這個訊息後,B用自己的私鑰解密A的訊息。其他所有收到這個報文的人都無法解密,因為只有B才有B的私鑰傳送方使用接收方的公鑰對資料加密,而接收方則使用自己的私鑰解密,這樣,資訊就可以安全無誤地到達目的地了,即使被第三方截獲,由於沒有相應的私鑰,也無法進行解密。通過數字的手段保證加密過程是一個不可逆過程,即只有用私有金鑰才能解密。
非對稱性加密依然沒有解決資料傳輸的安全性問題,比如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了。
四、https聯結器
明白了網際網路上的加密原理之後,下面來看看瀏覽器與伺服器互動時,瀏覽器想將資料加密後再發送給伺服器,那麼該怎麼做呢?伺服器首先要向瀏覽器出示一份數字證書,瀏覽器看到數字證書後,就可以使用數字證書裡面的公鑰加密資料,所以要想做瀏覽器和伺服器的加密資料傳輸,那麼首先得針對伺服器生成一份數字證書。然後再配置一下伺服器,讓伺服器收到瀏覽器的請求之後,會向瀏覽器出示它的數字證書。
4.1、生成Tomcat伺服器的數字證書
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金鑰庫裡面的所有證書
4.2、配置https聯結器
將生成的.keystore金鑰庫檔案拷貝到Tomcat伺服器的conf目錄下,如下圖所示:
修改server.xml檔案,配置https聯結器,程式碼如下:
<Connector port=“8443” protocol=“org.apache.coyote.http11.Http11Protocol”
maxThreads=“150” SSLEnabled=“true” scheme=“https” secure=“true”
clientAuth=“false” sslProtocol=“TLS”
keystoreFile=“conf/.keystore” keystorePass=“123456”/>
在server.xml檔案中配置了一個埠是8443的加密聯結器,瀏覽器訪問8443埠的聯結器時,將會以加密的方式來訪問web伺服器,這個聯結器收到瀏覽器的請求後,將會向瀏覽器出示一份數字證書,瀏覽器再用數字證書裡面的公鑰來加密資料,keystoreFile=“conf/.keystore” 用來指明金鑰庫檔案的所在路徑,伺服器從金鑰庫中提取證書時需要密碼,keystorePass="123456"指明金鑰庫的訪問密碼。
使用"https://localhost:8443/"訪問8443的加密聯結器
由於金鑰庫裡面的證書是我們手工生成的,沒有經過CA的認證,所以使用"https://localhost:8443/“訪問8443的加密聯結器,瀏覽器會出現"證書錯誤,導航已阻止”,瀏覽器認為當前要訪問的這個主機是不安全的,不推薦繼續訪問,點選就可以繼續訪問了,如下圖所示:
4.3、安裝數字證書
為了讓瀏覽器信任我們生成的數字證書,需要將數字證書安裝到瀏覽器中,以IE8瀏覽器為例進行證書安裝說明,安裝步驟如下:
證書安裝成功後,重啟IE瀏覽器,使用"https://localhost:8443/"訪問8443的加密聯結器,此時瀏覽器就不再提示證書錯誤了,如下圖所示:
4.4、刪除數字證書
以IE8為例進行說明,操作步驟如下:工具----->Internet選項
刪除之後重啟瀏覽器即可
一、打包JavaWeb應用
在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的體系結構
Tomcat伺服器的啟動是基於一個server.xml檔案的,Tomcat啟動的時候首先會啟動一個Server,Server裡面就會啟動Service,Service裡面就會啟動多個"Connector(聯結器)",每一個聯結器都在等待客戶機的連線,當有使用者使用瀏覽器去訪問伺服器上面的web資源時,首先是連線到Connector(聯結器),Connector(聯結器)是不處理使用者的請求的,而是將使用者的請求交給一個Engine(引擎)去處理,Engine(引擎)接收到請求後就會解析使用者想要訪問的Host,然後將請求交給相應的Host,Host收到請求後就會解析出使用者想要訪問這個Host下面的哪一個Web應用,一個web應用對應一個Context。
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="123456"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"><span style="color:rgb(0,0,255);line-height:1.5;"><</span><span style="color:rgb(128,0,0);line-height:1.5;">Host </span><span style="color:rgb(255,0,0);line-height:1.5;">name</span><span style="color:rgb(0,0,255);line-height:1.5;">="localhost"</span><span style="color:rgb(255,0,0);line-height:1.5;"> appBase</span><span style="color:rgb(0,0,255);line-height:1.5;">="webapps"</span>