Jetty9部署多個項目及虛擬主機配置的方法

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文件來配置上下文路徑:

  1. 第一步:在jetty根目錄下的webapps目錄下創建一個xml文件,名稱可以任意,如jetyy-webapp.xml;
  2. 第二步:假設我們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>

掃碼查看更多:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章