Tomcat下為每個Web應用配置不同的訪問端口
要完成這個目錄必須對conf/Server.xml文件進行配置
??????????????????????????? 設現在我們有兩個應用app1和app2,客戶端期望的訪問方式是:
??????????????????????????? App1???????? ->????? http://localhost:8081/
??????????????????????????? App2???????? ->????? http://localhost:8082/
??????????????????????????? 這樣省去了在主機名后面添加ContextPath的麻煩,相信客戶更愿意這樣使用。
??????????????????????????? 實現步驟:
1.????????找到conf/server.xml中的service配置節,復制這個service元素,緊跟在后面粘貼一次。如下:
<Servicename=" Catalina.app1 ">
??? <Connector port=" 8081 "protocol="HTTP/1.1"
??????????????connectionTimeout="20000"
?????????????? redirectPort="8443"/>
??? <Engine name=" Catalina.app1 " defaultHost=" localhost ">
????? <RealmclassName="org.apache.catalina.realm.LockOutRealm">???????
??????? <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
?????????????? resourceName="UserDatabase"/>
????? </Realm>
????? <Host name=" localhost "? appBase=" webapps "
??????????? unpackWARs="true"autoDeploy="true">??????
??????? <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
?????????????? prefix="localhost_access_log."suffix=".txt"
?????????????? pattern="%h %l %u %t"%r" %s %b" />
?????????????????? <Context path="/"docBase="app1" />
????? </Host>???????
??? </Engine>
?</Service>
說明:紅色加粗是特別要注意的部分。
???????? 1.1、<Servicename=" Catalina.app1 ">,這里設置Service的名字為 Catalina.app1, 是隨便取的名字不能和當前這個文件已有的Service元素同名。
???????? 1.2、<Connectorport=" 8081 "…/,這里設置當前服務的Http Connector監聽的端口為8081,注意不能和已有的其它Service的Connector的監聽端口相同。
???????? 1.3、<Enginename=" Catalina.app1 "defaultHost=" localhost ">,這里設置Engine的名字為 Catalina.app1 也不是必須的,你可以換其它名字,但是還是不要和其它Engine重名就行了。defaultHost這個屬性指出當前Engine根據主機頭在它的子元素中找不到匹配名稱的虛擬主機時所要訪問的缺省虛擬主機。我們這兒Engine里面只有一個虛擬主機因此缺省主機也是它。當然defaultHost屬性指定的主機名稱在它的子元素里面是必須存在的。
???????? 1.4、<Host name=" localhost "? appBase=" webapps " />,name屬性指定虛擬主機的名字,一般是Internet域名,Engine會根據HTTP協議請求里面的主機頭Host的值來匹配這里的虛擬主機名,如果匹配就交給該虛擬主機處理。比如,如果你的客戶端訪問地址是:http://qrkx.uten.cn:8090/index.jsp,那么這里虛擬主機名字就應該為qrkx.uten.cn,當然請求中的端口號是前面連接器最先使用的。appBase屬性指出虛擬主機上的Web應用是部署在哪里的。一個虛擬主機上可以同時部署多個Web應用,那么appBase就是指出這些應用的存放位置,這里可以使帶盤符的絕對路徑,像d:/webapps.也可以是相對路徑。這個相對路徑的起點就是Tomcat的安裝目錄。這里appBase屬性我們設置為webapps表示當前虛擬主機的Web應用存放目錄為tomcat安裝目錄下的webapps目錄里面。
???????? 1.5、 <Context path="/"docBase="app1" /> ,這個是最為關鍵的部分了。一個虛擬主機里面可以部署多個 Web 應用,而每個 Web 應用就是一個 Context ,因此這里可以配置多個 Context 元素,每個表示一個 Web 應用程序上下文。 Path 屬性表示訪問這個 Web 應用的路徑, ”/” 表示這個 Context 是當前虛擬主機的缺省 Web 應用程序,也可以為空字符串“”,這樣改 Context 可以用處理所有不匹配任何其它 Context 的 Context path 請求。我們訪問的時候就不用輸入 Web 應用的名稱了,可以如下訪問 http://localhost:80801/ ,如果你像這樣配置: <Contextpath="/app1" docBase="app1" />, 那么你就要這樣訪問: http://localhost:80801/app1/ 。總結一下意思就是在一個虛擬主機下只有一個 Web 應用是采用根路徑的,其它必須要指定特別的訪問路徑【根路徑只有一個】,比如 path="/app1" 、 path="/app2" 、 path="/app3" 等。
???????? docBase="app1" 這個屬性指出當前 Web 應用程序的存放路徑,可以是相對路徑也可以是絕對路徑,絕對路徑就是帶盤符的路徑 , 比如: d:/app1, 相對路徑就是以 Host 元素的 appBase 屬性指定的路徑為起點的路徑。這里 docBase="app1" 表示我們的當前 Web 應用程序是在 Tomcat 安裝目下的 webapps 目錄下的 app1 目錄。
????????
?
2、重復步驟一再次創建一個Service
<Servicename=" Catalina.app2 ">
??? <Connector port=" 8082 "protocol="HTTP/1.1"
??????????????connectionTimeout="20000"
?????????????? redirectPort="8443"/>
??? <Engine name=" Catalina.app2 " defaultHost=" localhost ">
????? <RealmclassName="org.apache.catalina.realm.LockOutRealm">???????
??????? <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
?????????????? resourceName="UserDatabase"/>
????? </Realm>
????? <Host name=" localhost "? appBase=" webapps "
??????????? unpackWARs="true"autoDeploy="true">??????
??????? <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
?????????????? prefix="localhost_access_log."suffix=".txt"
?????????????? pattern="%h %l %u %t"%r" %s %b" />
?????????????????? <Context path="/"docBase="app2" />
????? </Host>???????
??? </Engine>
?</Service>
?
3、啟動Tomcat,觀察日志輸出
?
信息: Deploying webapplication directory E:\WorkSpace\JavaWorkspace\Tomcat 7.0\webapps\app1
2012-6-414:03:36 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-default.xml]
2012-6-414:03:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-plugin.xml]
2012-6-414:03:37 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts.xml]
2012-6-414:03:38 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying webapplication directory E:\WorkSpace\JavaWorkspace\Tomcat 7.0\webapps\app2
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-default.xml]
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts-plugin.xml]
2012-6-414:03:39 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: Parsingconfiguration file [struts.xml]
?
4、通過瀏覽器訪問:
???????? http://localhost:80801/index.jsp
???????? 我們通過觀察瀏覽器發出的請求頭如下:
Request URL: http://localhost:8081/index.jsp
Request Method: GET
Status Code: 200 OK
Request Headers view source
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Cookie: JSESSIONID=CADAAC6E5B9366F4590E50B889BE58BF
Host: localhost:8081
Pragma: no-cache
User-Agent: Mozilla/5.0 (Windows NT 5.1)AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 QIHU360EE
Response Headers view source
Content-Length: 1235
Content-Type: text/html;charset=UTF-8
Date: Mon, 04 Jun 2012 06:24:19 GMT
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=BA86EAD5BBDF7BB51343377C88588AB8;Path=/; HttpOnly
?
???????? 請注意紅色的部分就是主機頭,一般是Internet域名。
?
???????? http:// localhost:80802/ognl.jsp
???????? 這里和上面做法一樣,主機頭是: Host: localhost:8082
5、觀察Tomcat的conf目錄:
????????
???????? 你發現了什么?????????????????????????????????????
???????? Catalina.app1 和 Catalina.app2 是我們分別配置的兩個 Engine 的名字。打開這兩個目錄,我們發現:
????????
???????? 里面都有個 localhost ,其實這是我們上面配置的虛擬主機名稱,如果你配置的虛擬主機名稱是 qrkx.uten.cn ,那么這里目錄的名稱就是 qrkx.uten.cn 了。
?
???????? 注意:如果你的 Webapps 目錄下有 ROOT 目錄請將其更名或刪除,否則訪問地址 :http://localhost:8081 和 http://localhost:8082 是會出問題的。官方文檔有這樣的說明: If the contextPath is a zero length string, the base name isROOT
?
?
使用主機頭示范,由于測試環境沒有DNS服務器,搭建太麻煩。我們通過修改本機的如下文件模擬實現:
C:\WINDOWS\system32\drivers\etc\HOSTS,該文件作用:
host是一個沒有擴展名的系統文件,可以用記事本等工具打開,其作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯“數據庫”,當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,一旦找到,系統會立即打開對應網頁,如果沒有找到,則系統再會將網址提交DNS域名解析服務器進行IP地址的解析。
我們在文件中添加如下:
127.0.0.1 localhost
127.0.0.1 app1.family.cn
127.0.0.1 app2.family.cn
然后修改server.xml文件中虛擬主機的主機頭分別為:
<Servicename="Catalina.app1">
???<Connector port="8081" protocol="HTTP/1.1"
??????????????connectionTimeout="20000"
?????????????? redirectPort="8443"/>
???<Engine name="Catalina.app1" defaultHost=" app1.family.cn ">
????? <Realm className="org.apache.catalina.realm.LockOutRealm">???????
??????? <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
??????????????resourceName="UserDatabase"/>
????? </Realm>
????? <Host name=" app1.family.cn "? appBase="webapps"
??????????? unpackWARs="true" autoDeploy="true">??????
??????? <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
??????????????prefix="localhost_access_log." suffix=".txt"
?????????????? pattern="%h %l %u %t"%r" %s %b" />
?????????????????? <Contextpath="" docBase="app1" />
????? </Host>???????
???</Engine>
?</Service>
?<Service name="Catalina.app2">
???<Connector port="8082" protocol="HTTP/1.1"
??????????????connectionTimeout="20000"
?????????????? redirectPort="8443"/>
???<Engine name="Catalina.app2" defaultHost=" app2.family.cn ">
????? <RealmclassName="org.apache.catalina.realm.LockOutRealm">???????
??????? <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"
??????????????resourceName="UserDatabase"/>
????? </Realm>
????? <Host name=" app2.family.cn " ?appBase="webapps"
??????????? unpackWARs="true"autoDeploy="true">??????
??????? <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"
??????????????prefix="localhost_access_log." suffix=".txt"
?????????????? pattern="%h %l %u %t"%r" %s %b" />
?????????????????? <Contextpath="" docBase="app2" />
????? </Host>???????
???</Engine>
?</Service>
?
重新啟動Tomcat,在瀏覽器地址欄訪問如下地址:
http://app1.family.cn:80801/inde.jsp
http://app1.family.cn:80802/ognl.jsp
成功!!!!!!!!!
?
觀察Tomcat下的conf目錄:
?
不難發現,在兩個Engine的名稱的目錄下各自生成了虛擬主機名稱的目錄。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
