2015-04-01 35 views
1

我想知道,如果有一個乾淨的方式來請求一個Web應用程序的名稱不出現在請求url中的請求。某種程度上,url應該是webapp的別名。另外,這個別名不應該是靜態的,也不能用這個單一的webapp修復,但是我需要能夠輕鬆地改變別名後面的webapp,以便進行版本增量。 的事,那來我的心是非靜態webapp別名

  • 打造「門面」的webapp請求重定向
  • 重命名完整的web應用程序

兩個想法不會導致期望的結果。我想有一個更輕量級的解決方案。

這可能嗎?

+0

通常,這是通過前端網絡系統實現的,無論是負載均衡設備還是重寫apache/nginx安裝。 – Affe 2015-04-01 21:30:46

+0

@Affe好吧,但這聽起來像是一個開銷?我不希望我的整個流量重定向,只是在我的容器內部請求一個webapp。你可以詳細闡述一個簡單的用例場景嗎? – tareq 2015-04-01 21:40:49

+0

你目前使用什麼作爲前端?你是否將tomcat直接暴露給互聯網? http://nginx.org/en/docs/http/ngx_http_rewrite_module.html – Affe 2015-04-01 21:51:45

回答

1

感謝來自Alexander的帖子,我發現了正確的軌道,但我使用了一些額外的工作,這或多或少是我原始問題中提到的第1點中提到的門面webapp。首先,我將我所有的標準webapps部署在/tomcat/webapps中,其中一個標準的context.xmlautoDeploy模式處於打開狀態。爲了捕獲所有其他請求,這些請求與部署的上下文不匹配,我設置了一個新的Web應用程序,作爲未匹配請求的默認Web應用程序。我們稱之爲dispatcher-app

要使這個工作,我必須將它設置爲ROOT。要以原名稱部署它,我將它定位在/tomcat/webapps2及其關聯的context.xml/tomcat/conf/Catalina/localhost/ROOT.xml之下。有必要將它放在/webapps之外,以防止在tomcat中使用其他web應用程序使用的autoDeploy模式進行雙重部署。對其他信息可以在這裏找到:http://tomcat.apache.org/tomcat-7.0-doc/config/context#Naming

ROOT.xml看起來是這樣的:

<Context 
    path="" 
    docBase="/path/to/tomcat-base/webapps2/dispatcher-app" 
    crossContext="true" 
/> 

dispatcher-app的web.xml中確認,它採用

<servlet-mapping> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

dispatcher-app內外觀對於用戶使用uriInfo.getAbsolutePath()請求的原始路徑。然後,它將來自url的應用程序與在tomcat中運行的應用程序(從自定義配置文件中已知)進行匹配。如果匹配,則配置文件知道應該向哪個應用程序發送。例如,用戶請求myserver/webapp-1/test?param=value,並將其轉發給myserver/webapp-1.1.2/test?param=value。如果應用程序版本發生更改,則要轉發的Web應用程序可以在配置文件中手動更新。

實際應向前使用

RequestDispatcher dispatcher=servletContext.getRequestDispatcher(redirectTo); 
dispatcher.forward(request, response); 

因爲遠期將不會對用戶可見的進行。

由於我無法做到這一點(請參閱Cross-context request forwarding in tomcat results in java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger),我現在只需使用307重定向。

return Response.status(307).location(new URI(redirectTo)).build(); 

這個的缺點是瀏覽器會在地址欄中顯示重定向URL。

UPDATE:RequestDispatcher作品現在,只要不是上述這種特殊情況下/ web應用。所以我更喜歡通過重定向方式。

有一點要注意的是,在第二web應用程序是基於容器的認證(例如realm)將不會生效(如同我們前進「的背後」 tomcat的門面),所以dispatcher-app需要一個身份驗證方法本身或認證需求用另一種機制,如RequestFilter

1

如果你想使用Tomcat做的唯一手段,可以靜態映射你的webapp的路徑在Tomcat中context.xml定義上下文和映射request path(「路徑」)爲webapp dir(「的docBase」)。

只需添加到您的<tomcatDir>/conf/context.xml

<Context 
    path="" 
    docBase="/<pathToYourWebapp>/<yourApp>" 
/> 

這有副作用,你只能有一個Web應用程序,當然,因爲每個請求UND /映射到你的web應用。

查看http://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Common_Attributes瞭解更多信息。

+0

這會有缺點,即如果上下文文件後面的web應用程序發生更改,我必須爲每個公開的web應用程序維護一個context.xml文件並對其進行修改。我對嗎?另外我想,我需要在修改後重新啓動tomcat。 – tareq 2015-04-02 10:14:01

+0

如果您將此''節點添加到** context.xml('conf/context.xml'),它將** **每個webapp中**一個節點**,並且僅** context.xml * *。我想你也可以在'conf/Catalina/localhost/'中爲每個webapp添加一個context.xml,但這是一個不同的故事。另一種方式是由@Affe(「...負載均衡設備或apache/nginx」)提出的 - 這將不需要配置tomcat,而是配置一些東西 – Alexander 2015-04-02 11:28:00