session - page - Compruebe si existe sesión JSF
view expired primefaces (2)
Tengo una página de inicio de sesión donde tengo un bean User para autenticar el nombre de usuario y la contraseña de una persona. Este frijol tiene alcance de sesión. Si alguien escribe una URL e intenta saltar la página de inicio de sesión, ¿cómo puedo verificar eso y redirigirlo a la página de inicio de sesión?
Por otra parte. Supongamos que he iniciado sesión y que estaba trabajando y de repente salgo por un tiempo y mi sesión expira. Cuando regreso e intento interactuar con el formulario, envía un mensaje que me avisa de la caducidad de la sesión. ¿Cómo puedo redireccionar de nuevo al formulario de inicio de sesión cuando esto ocurre?
Gracias por adelantado. Espero que me explique.
Mojarra 2.1.4, Tomcat 7, Tomahawk 1.1.11
Si está implementando su propio sistema, puede agregar un atributo al usuario llamado session o lo que sea. Este atributo puede ser booleano, por lo que siempre que se inicie la sesión puede establecer este atributo en verdadero. Escriba un método llamado permiso, por ejemplo:
public void permission() throws IOException {
if(userStatelessBean.getSession() == false) {
System.out.println("*** The user has no permission to visit this page. *** ");
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
context.redirect("login.xhtml");
} else {
System.out.println("*** The session is still active. User is logged in. *** ");
}
}
En cada una de las páginas de jsf ( para este ejemplo ) sobre las que desea tener restricciones, puede agregar el siguiente código al principio de su página:
<f:metadata>
<f:event type="preRenderView" listener="#{sesija.permission()}"/>
</f:metadata>
Lo que esto hará es llamar a JSF ManagedBean con nombre de objeto sesija antes de mostrar la página y verificar si los rulles que ha creado en el método especificado están satisfechos o no.
Espero que encuentres esto útil,
Gracias.
Si alguien escribe una URL e intenta saltar la página de inicio de sesión, ¿cómo puedo verificar eso y redirigirlo a la página de inicio de sesión?
Parece que usa autenticación interna. En ese caso, debe implementar un filtro de servlet . JSF almacena beans administrados de ámbito de sesión como atributos de HttpSession
, por lo que puede verificarlo en el método doFilter()
:
HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");
if (userManager != null && userManager.isLoggedIn()) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/login.xhtml");
}
Asigne este filtro a un patrón de URL que cubra las páginas protegidas, por ejemplo /app/*
.
Cuando regreso e intento interactuar con el formulario, envía un mensaje que me avisa de la caducidad de la sesión. ¿Cómo puedo redirigir de nuevo al formulario de inicio de sesión cuando esto ocurre?
Entiendo que esto se refiere a las solicitudes de Ajax Para solicitudes normales, podría haber usado una <error-page>
en web.xml
. Si configura el método de ahorro de estado para el cliente en web.xml
siguiente manera
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
no es una opción, entonces necesita implementar un ExceptionHandler
personalizado:
public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public void handle() throws FacesException {
FacesContext facesContext = FacesContext.getCurrentInstance();
for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
Throwable exception = iter.next().getContext().getException();
if (exception instanceof ViewExpiredException) {
facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
facesContext.renderResponse();
iter.remove();
}
}
getWrapped().handle();
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
}
(tenga en cuenta que este ejemplo particular navega para viewexpired
, por lo que espera un /viewexpired.xhtml
como página de error)
Lo anterior debe ser horneado por la siguiente implementación de ExceptionHandlerFactory
:
public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
}
}
que a su vez debe registrarse en faces-config.xml
siguiente manera:
<factory>
<exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>