2011-10-12 7 views
7

Estoy usando PrettyFaces en mi aplicación JSF. El sitio requiere autenticación para acceder a algunas páginas, así que estoy usando un oyente (vista previa) que verifica si el usuario está conectado. Por lo tanto, si el usuario intenta acceder a/foo (/foo.jsf antes de PrettyFaces), redirijo iniciar sesión.Obteniendo el URI de solicitud original con PrettyFaces

Sin embargo, quiero redirigirlos a su destino inicial, por lo que quiero adjuntar un parámetro de solicitud "siguiente" para que redirija al usuario a/login? Next =/foo en su lugar. Por desgracia, no puedo conseguir el RequestURI original del objeto de la petición, la cadena URI en el código siguiente se /appname/foo.jsf en lugar de/nombreaplic/foo

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

¿Hay una manera de recuperar el original Ruta URI?

Respuesta

6

PrettyFaces utiliza bajo las cubiertas RequestDispatcher#forward() para enviar una bonita URL a la URL real. Con esta técnica, el URI de solicitud original está disponible como atributo de solicitud con la clave RequestDispatcher#FORWARD_REQUEST_URI.

Por lo tanto, esto debería hacer:

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

¡Muchas gracias! De hecho, está almacenado en requestMap, sin embargo, el nombre de la clave fue ligeramente diferente y se le dio como una cadena. Lo siguiente funcionó. Cadena originalURI = (Cadena) ctx.getRequestMap(). Get ("javax.servlet.forward.request_uri"); – ustun

+0

Uhm, ese es el mismo valor que 'RequestDispatcher # FORWARD_REQUEST_URI'. Consulte también javadoc: http://download.oracle.com/javaee/6/api/constant-values.html#javax.servlet.RequestDispatcher.FORWARD_REQUEST_URI ¿Qué obtuvo exactamente cuando publicó el valor? ¿O simplemente no compiló? (esa constante se introdujo en Servlet 2.5). – BalusC

+0

Sí, no se compiló, se quejaba del campo faltante. Extraño, pensé que ya estaba usando Servlet 2.5 (tenerlo en las dependencias), pero tal vez alguna otra versión anterior está anulando. – ustun

3

Use este código para obtener la URL solicitud original:..

PrettyContext.getCurrentInstance() getRequestUrl() toURL()

Cuestiones relacionadas