2011-10-12 10 views
7

Używam PrettyFaces w mojej aplikacji JSF. Witryna wymaga uwierzytelnienia, aby uzyskać dostęp do niektórych stron, więc używam detektora (widok prerender), który sprawdza, czy użytkownik jest zalogowany. Jeśli więc użytkownik próbuje uzyskać dostęp do/foo (/foo.jsf przed PrettyFaces), przekierowuję zalogować się.Uzyskiwanie oryginalnego URI żądania z PrettyFaces

Jednak chcę przekierować je do ich początkowego miejsca docelowego, więc chcę dołączyć parametr żądania "następny", aby zamiast tego przekierować użytkownika na/login? Next =/foo. Niestety, nie mogę dostać oryginalny requestURI od przedmiotu wniosku, uri ciąg w następujący kod jest /appname/foo.jsf zamiast/appname/foo

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

Czy istnieje sposób, aby odzyskać oryginał Ścieżka URI?

Odpowiedz

6

PrettyFaces używa pod osłonami RequestDispatcher#forward(), aby przekazać ładny adres URL do prawdziwego adresu URL. Przy użyciu tej techniki pierwotny identyfikator URI żądania jest dostępny jako atrybut żądania z kluczem RequestDispatcher#FORWARD_REQUEST_URI.

Tak, należy to zrobić:

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

Wielkie dzięki! W rzeczywistości jest to zapisane w requestMap, jednak nazwa klucza była nieco inna i podana jako ciąg. Następujące pracował. String originalURI = (String) ctx.getRequestMap(). Get ("javax.servlet.forward.request_uri"); – ustun

+0

Uhm, to ta sama wartość, co 'RequestDispatcher # FORWARD_REQUEST_URI'. Zobacz także javadoc: http://download.oracle.com/javaee/6/api/constant-values.html#javax.servlet.RequestDispatcher.FORWARD_REQUEST_URI Co dokładnie dostałeś, gdy sysout się wartości? A może po prostu się nie skompilował? (ta stała została wprowadzona w Servlet 2.5). – BalusC

+0

Tak, nie skompilowano, narzekając na brakujące pole. Dziwne, myślałem, że już używam Serwletu 2.5 (mam go w zależnościach), ale być może inna stara wersja jest nadrzędna. – ustun

3

użyć tego kodu, aby uzyskać oryginalną URL żądania..

PrettyContext.getCurrentInstance() getRequestUrl() toURL()

Powiązane problemy