2011-10-12 120 views
7

我在我的JSF應用程序中使用PrettyFaces。該站點需要身份驗證才能訪問某些頁面,因此我使用了偵聽器(prerender視圖)來檢查用戶是否已登錄。因此,如果用戶嘗試在PrettyFaces之前訪問/ foo(/foo.jsf),我將重定向登錄。使用PrettyFaces獲取原始請求URI

但是,我想將它們重定向到它們的初始目標,所以我想附加請求參數「next」,以便將用戶重定向到/ login?next =/foo。不幸的是,我不能從請求對象得到原requestURI,在下面的代碼中的URI串/appname/foo.jsf而不是/應用程序的名字/富

ctx = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletRequest request = (HttpServletRequest) ctx.getRequest(); 
String uri = request.getRequestURI(); 

有沒有辦法恢復原始URI路徑?

回答

6

PrettyFaces使用掩護RequestDispatcher#forward()轉發一個漂亮的URL到真實的URL。使用這種技術,原始請求URI作爲請求屬性可用密鑰RequestDispatcher#FORWARD_REQUEST_URI提供。

所以,這應該這樣做:

String originalURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 
+0

非常感謝!它確實存儲在requestMap中,但是鍵名稍有不同,並以字符串形式給出。以下工作。 String originalURI =(String)ctx.getRequestMap()。get(「javax.servlet.forward.request_uri」); – ustun

+0

呃,這與'RequestDispatcher#FORWARD_REQUEST_URI'的值相同。另請參閱javadoc:http://download.oracle.com/javaee/6/api/constant-values.html#javax.servlet.RequestDispatcher.FORWARD_REQUEST_URI在系統化該值時,您究竟得到了什麼?還是隻是沒有編譯? (這個常量是在Servlet 2.5中引入的)。 – BalusC

+0

是的,它沒有編譯,抱怨丟失的領域。奇怪的是,我以爲我已經在使用Servlet 2.5(在依賴關係中),但也許其他一些舊版本重寫。 – ustun

3

使用此代碼來獲取原始請求URL:。

PrettyContext.getCurrentInstance()getRequestUrl()的toURL()