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>
掃碼查看更多: