1.介紹
Jetty會對webapps目錄下的幾乎所有war包、目錄、xml檔案進行自動部署。如果war包、目錄和xml檔案同名,則部署的順序為xml檔案 > war包 > 目錄 。如webapps目錄下有:bank.war、bank目錄、bank.xml,其中目bank錄為bank.war解壓後的目錄,bank.xml中引用的是bank.war包或者bank目錄,則此時僅有xml檔案被部署。如果它們不同名,但又是同一個工程的,則會導緻工程被重複部署!,是以同一個項目的war包、目錄、xml檔案都應該同名。
2.Jetty的上下文路徑(context path)配置
-
預設的上下文路徑
預設情況下,Jetty會将webapps目錄下的工程名作為上下文路徑。如果工程名稱為ROOT,則上下文路徑為/。如将bank.war(或bank目錄)放在webapps目錄下,則上下文路徑為/bank,如果将bank.war重命名為ROOT.war,則上下文路徑為/。那麼要通路bank的ULR的上下文路徑就是:http://localhost:8888/bank
-
自定義上下文路徑
如果上述的方式無法滿足要求,則可以通過xml檔案來配置上下文路徑:
- 第一步:在jetty根目錄下的webapps目錄下建立一個xml檔案,名稱可以任意,如jetyy-webapp.xml;
-
第二步:假設我們webapps目錄下有個bank.war項目,我們來給它配置一個自定義上下文路徑,在xml檔案中加入如下内容:
jetyy-webapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/bank888</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/bank.war</Set>
</Configure>
配置完成後,通路bank站點的上下文路徑就是:http://localhost:8888/bank888
3.配置虛拟主機
虛拟主機讓通路web的多一種方式,虛拟主機是一般是一個注冊在DNS的域名。多個域名對應到一個IP。虛拟主機可以解決共享一個Jetty伺服器執行個體的同一個IP。
虛拟主機的配置有以下方法:
- 在webapps目錄下使用一份上下文路徑配置的xml檔案,如上面的jetty-webapp.xml。
- 給所有在webapps目錄下發現的上下文,用綁定配置虛拟主機的方式建立一個自定義部署。
- 在嵌入Jetty的應用情況中,還可以通過直接調用API的方式來實作虛拟主機配置及通路
- 使用WEB-INF/jetty-web.xml來配置虛拟主機(已過時)
3.1虛拟主機的名稱
Jetty支援以下這個形式的虛拟主機名稱:
- www.hostname.com,類似這樣的全限定主機名。這樣的配置使用來自www.hostname.com和hostname.com的通路都可以被接收到
- .hostname.com,使用通配符限定主機,但隻比對一級任意名稱,如.foo.com可以比對到www.foo.com和m.foo.com,但無法比對到www.other.foo.com。
- 10.0.0.2,IP位址也可以用來作為虛拟主機名,這表明上下文要處理從沒有指定主機名的伺服器端口收到的請求
- @ConnectorName,連接配接名稱,這不是嚴格意義上的虛拟主機,它隻比對通過Connector.setName(String)設定名稱的連接配接器收到的請求。
- www.√integral.com,非ASCII和IDN域名
3.2配置虛拟主機
我們給上下文/bank888配置虛拟主機:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/bank888</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/bank.war</Set>
<Set name="virtualHosts">
<Array type="java.lang.String">
<Item>www.MyVirtualDomain.com</Item>
<Item>m.MyVirtualDomain.com</Item>
<Item>*.OtherVirtualDomain.com</Item>
<Item>@ConnectorName</Item>
<Item>localhost</Item>
<Item>127.0.0.1</Item>
</Array>
</Set>
</Configure>
注意:在實踐中,@ConnectorName這種方式,會比較容易出問題,一失敗,上下文就會失敗。
通路的方式就變成了(虛拟主機+端口+上下文路徑):http://127.0.0.1:8080/bank888
如果還需要添加webapps中其他項目的虛拟主機,可以在webapps目錄下繼續按上面的方式建立xml檔案。推薦xml檔案與war名稱或目錄名稱一樣,否則會引起重複部署。
注意:虛拟主機的方式隻是提供了其他的方式來通路web,并不影響原有的通路方式(原有的:IP+端口+上下文路徑)。
4.Jetty9下關閉目錄通路(關閉目錄周遊和關閉目錄下的檔案展示
- 沒有關閉目錄通路前,通路http://localhost:8888
- 上述就将webapps目錄下的web全部顯示出來了。上面這種情況,是沒有配置任何自定義上下文的情況下出現的。
- 自定義配置web的上下文,下關閉目錄通路
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/gro.war</Set>
<Set name="virtualHosts">
<Array type="String">
<Item>www.MyVirtualDomain.com</Item>
<Item>m.MyVirtualDomain.com</Item>
<Item>*.OtherVirtualDomain.com</Item>
<Item>localhost</Item>
<Item>127.0.0.1</Item>
</Array>
</Set>
<!--關閉目錄通路-->
<Call name="setInitParameter">
<Arg>org.eclipse.jetty.servlet.Default.dirAllowed</Arg>
<Arg>false</Arg>
</Call>
</Configure>
上面定義了web的上下文為/,且關閉目錄通路,此時如果通路http://localhost:8888:
注意:實踐結果顯示,隻要自定義配置上下文中,有一個web的上下文是/,那麼基本不可能再顯示出webapps下的web目錄。似乎與下面的配置無任何關系:
<Call name="setInitParameter">
<Arg>org.eclipse.jetty.servlet.Default.dirAllowed</Arg>
<Arg>false</Arg>
</Call>