您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關大數據中如何不配置應用名訪問應用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
如何不使用應用名,直接通過虛擬主機的名稱或綁定的域名來訪問應用呢?
進行Web開發部署的人常會有以上的疑問。在進行Web應用發布時,經常需要通過以下這種形式進行應用的請求。
虛擬主機 +端口 + 應用名
而如果我們配置了針對應用的特定虛擬主機,一個虛擬主機上只有這一個應用,再通過應用名訪問就沒什么必要,同時顯的繁瑣。
那在Tomcat中,怎么樣配置,以支持通過虛擬主機(端口如果是80,也可以跳過)直接訪問應用呢?
官方文檔中,對于Context中應用名稱這個屬性有這樣的描述:
我們看到,如果要為虛擬主機配置默認的應用,我們可以給context的path配置為空。這里注意一下,為空的意思,是指空串,而不是不指定。當然,對于應用名稱,我們在指定時一般是 /abc 這種形式,所以為空時,也可以指定成 / 這樣
所以,配置成以下兩種形式,都是OK的。
<Context path="" docBase="/home/abc/xxx"/>
<Context path="/" docBase="/home/abc/xxx"/>
當然,除了以上這種配置外,將應用的WAR包或者目錄命名為ROOT,也可以起到上面的作用。Tomcat在webapps目錄下自帶的ROOT應用就是個例子。
我們來看Tomcat內部,是如何處理的這些邏輯。
首先在Server啟動時,會涉及到應用的部署,部署過程,可以參考前面的文章:
WEB應用是怎樣進行部署的
部署過程中,會根據具體的Context的配置,獲取對應的應用名稱,從而進行應用名稱的配置和注冊。
以下是部署前,解析配置的應用名稱:
部署時,根據是在server.xml中配置部署還是在自動部署目錄中部署,處理情況不同:
在配置文件中配置的情況:
我們再看,在代表應用名稱的類ContextName內,包含以下聲明:
public static final String ROOT_NAME = "ROOT";
同時,應用部署,獲取具體Context名稱的時候,對應的ContextName構造函數里有下面的邏輯,
public ContextName(String path, String version) {
// Path should never be null, '/' or '/ROOT'
if (path == null || "/".equals(path) || "/ROOT".equals(path)) {
this.path = "";
} else {
this.path = path;
}
同時,對于
我們發現對于ROOT應用,在另一個構造函數里,直接對應到的請求路徑為空。
if (ROOT_NAME.equals(tmp2)) {
path = "";
}
后續的Context注冊,就會用到這里的path。這里的注冊過程,可以參考前面的文章:
Tomcat多虛擬主機配置及原理
我們看到,注冊的過程中,如果有path為/的情況,也會自動轉化為空串。
沒有匹配到,就會匹配a的默認值0,即第一個應用。第一個應用是什么呢?
就是我們配置的默認應用,path為空的那個。
例如下面是Tomcat自帶的幾個應用的path,這是在mapper中注冊的情況。
所以,在配置到默認的path為空的應用后,就會用它進行請求的后續響應了。
關于大數據中如何不配置應用名訪問應用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。