2010-09-15 82 views
1

我正計劃一個URL重寫器/編碼器(也許重寫器是一個更好的術語)。主要目的是從客戶端隱藏確切的URL,因爲如果他足夠聰明,他可以弄清楚如何搞砸應用程序。URL編碼的設計解決方案

URL編碼器將是一個內射函數f(x) = y。解碼器將是f的反函數,比如g,使得g(y) = x。這樣我可以編碼和解碼我的網址。

的URL,如:

http://www.myapp.com/servlet/myapp/template/MyScreen.vm/action/MyAction 將被編碼爲類似:

http://www.myapp.com/uyatsd6787asv6dyuasgbdxuasydgb876876v

不要緊,什麼是在編碼的URL,只要它是不理解。

問題是我不知道如何操作瀏覽器顯示的URL。我將JBoss用作servlet容器,並將Turbine servlet用作Web應用程序框架。 我需要一個接收編碼的URL,解碼它,將它傳遞給Turbine的模塊,然後修改響應的URL以再次顯示編碼的URL。

以前曾試圖解決這個問題: 我創建了一個Servlet過濾器,但由於濾波器接收一個ServletRequest是一個JBoss實現我無法訪問URL。據我看來,似乎servlet過濾器不是一個好的選擇來操縱URL。

回答

2

也許你可以做一些事情,比如寫一個接受初始請求的servlet,解碼URL,然後在內部轉發到你現有的servlet。

例如,有一個servlet將接受:

www.myapp.com/enc/uyatsd6787asv6dyuasgbdxuasydgb876876v 

這個servlet可以被設置爲處理與/ ENC /或其他一些標記開始的請求,指示URL需要去解碼器servlet。使用類似

/servlet/myapp/template/MyScreen.vm/action/MyAction 

,然後在內部着這個網址上現有的servlet:這將解碼的URL來

getServletContext().getRequestDispatcher(decoded_url).forward(req, res); 
+0

着如果我在內部解碼後的URL會的瀏覽器中的URL仍然是原始的(編碼的)? – Atticus 2010-09-15 13:39:51

+1

瀏覽器的URL應該保持不變,因爲您的serlvet正在內部轉發,而不是將重定向發回給用戶。 – worpet 2010-09-15 16:01:02

+0

這似乎是一個很好的解決方案,但是你必須創建一個新的請求,因爲在第一次請求之後,Turbine servlet將知道它的url模式,並且所有鏈接都將指向Turbine servlet。因此,您必須創建一個新的包裝請求來重寫getServletPath()方法,以返回新的讓我們說過濾器servlet的url模式,它將請求轉發到正確的目標。 – Atticus 2010-09-16 08:27:39