2016-08-22 80 views
1

背景春天啓動的:使用RewriteValve

嵌入式的Tomcat我在一個簡單的Java應用程序中使用Spring 1.4啓動。作爲一個實驗,我決定編寫自己的servletContainer()bean,將Tomcat的RewriteValve注入到容器中。此閥門作爲全局上下文閥門添加,並應適用於所有請求。

我正在使用Tomcat 8.5.x.

因爲Valve期望配置在WEB-INF文件夾中可用,所以我設法覆蓋它的startInternal()方法,讓它讀取類路徑位置下的rewrite.config文件,該位置是containers/tomcat/rewrite.config。

該閥門讀取配置良好。該rewrite.config文件只是規定了以下規則:

^/app2.+ /app 

含義,重寫URL爲/應用程序時,請求URL與/ APP 2開始。

請注意,應用程序本身部署在/ app下,而不是ROOT下。這是通過server.context-path屬性來處理的。

由於應用程序是在/應用程序部署什麼行不通

,閥門從來沒有真正/ APP 2請求被提交時調用。例如:

  1. http://localhost:8080/app2從未激活閥
  2. http://localhost:8080/app/app2激活閥

如果我刪除了上下文路徑和部署下根/應用程序,這是我可以觀察到:

  1. http://localhost:8080/app2激活閥門

什麼工作

使用外部Tomcat容器,如果我手動配置相同規則的閥門,並部署在/應用程序的應用程序,我可以觀察到:

  1. http://localhost:8080/app2正確激活閥。 url被改寫爲http://localhost:8080/app

我會做什麼錯?

+0

我認爲,作爲本地主機不輸出的快照會更合適對其他機器可見 – emotionlessbananas

+0

使用嵌入式tomcat和部署到獨立的tomcat是有區別的。嵌入式tomcat只監聽上下文路徑上的url(所以基本上整個服務器的根目錄已被更改!)而獨立的tomcat(沒有修改)偵聽'/'並根據url發送到正確的應用程序。因此,這裏描述的結果基本上或多或少都如我所預期的那樣。你自己的'servletContainer',它基本上是渲染默認的很沒用,添加你的代碼以獲得更多幫助。 –

+0

你所描述的是有道理的。我的servletContainer中沒有什麼值得真正分享的。它所做的只是創建一個新的閥門實例,讓我們讀取配置文件並將其作爲上下文閥門添加到工廠中。而已。 –

回答

0

您在用於描述重寫規則

^/app2.+ /app 

的「。+」部分的正則表達式做出了錯誤意味着occurres一次或多次的任何字符,但需要至少app2字符串之後的一個字符。我認爲你應該簡單地將它改爲「。*「,這意味着有可能是APP2之後的字符,但在同一時間,我們不希望它在那裏:

^/app2.* /app