我想知道,如果有一個乾淨的方式來請求一個Web應用程序的名稱不出現在請求url中的請求。某種程度上,url應該是webapp的別名。另外,這個別名不應該是靜態的,也不能用這個單一的webapp修復,但是我需要能夠輕鬆地改變別名後面的webapp,以便進行版本增量。 的事,那來我的心是非靜態webapp別名
- 打造「門面」的webapp請求重定向
- 重命名完整的web應用程序
兩個想法不會導致期望的結果。我想有一個更輕量級的解決方案。
這可能嗎?
我想知道,如果有一個乾淨的方式來請求一個Web應用程序的名稱不出現在請求url中的請求。某種程度上,url應該是webapp的別名。另外,這個別名不應該是靜態的,也不能用這個單一的webapp修復,但是我需要能夠輕鬆地改變別名後面的webapp,以便進行版本增量。 的事,那來我的心是非靜態webapp別名
兩個想法不會導致期望的結果。我想有一個更輕量級的解決方案。
這可能嗎?
感謝來自Alexander的帖子,我發現了正確的軌道,但我使用了一些額外的工作,這或多或少是我原始問題中提到的第1點中提到的門面webapp。首先,我將我所有的標準webapps部署在/tomcat/webapps
中,其中一個標準的context.xml
和autoDeploy
模式處於打開狀態。爲了捕獲所有其他請求,這些請求與部署的上下文不匹配,我設置了一個新的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
。
如果你想使用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瞭解更多信息。
這會有缺點,即如果上下文文件後面的web應用程序發生更改,我必須爲每個公開的web應用程序維護一個context.xml文件並對其進行修改。我對嗎?另外我想,我需要在修改後重新啓動tomcat。 – tareq 2015-04-02 10:14:01
如果您將此'
通常,這是通過前端網絡系統實現的,無論是負載均衡設備還是重寫apache/nginx安裝。 – Affe 2015-04-01 21:30:46
@Affe好吧,但這聽起來像是一個開銷?我不希望我的整個流量重定向,只是在我的容器內部請求一個webapp。你可以詳細闡述一個簡單的用例場景嗎? – tareq 2015-04-01 21:40:49
你目前使用什麼作爲前端?你是否將tomcat直接暴露給互聯網? http://nginx.org/en/docs/http/ngx_http_rewrite_module.html – Affe 2015-04-01 21:51:45