Si alguien escribe un URL y trata de saltar la página de inicio de sesión, ¿cómo puedo comprobar que y le redirigirá a la página de inicio de sesión?
Parece que usa la autenticación interna. En ese caso, debe implementar un servlet filter. JSF sesión de tiendas de ámbito de granos gestiona como atributos de HttpSession
, por lo que sólo pudo comprobar que, en doFilter()
método:
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");
}
Ubicación filtro en un patrón de URL que cubre las páginas seguras, por ejemplo, /app/*
.
Cuando regrese y tratar de interactuar con el formulario se envía un mensaje de alertándome la expiración de 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 un <error-page>
en web.xml
. Si la configuración del estado método para el cliente ahorrar en web.xml
de la 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 usted necesita para poner en práctica una costumbre ExceptionHandler
:
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 en particular se desplaza a viewexpired
, por lo que espera un /viewexpired.xhtml
como página de error)
Lo anterior debe ser horneado por la siguiente implementación ExceptionHandlerFactory
ión:
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 tiene que ser registrada en faces-config.xml
de la siguiente manera:
<factory>
<exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
Tenía algunas dudas sobre esto. Me pidieron que agregue un commandLink que dice "Ir a la página principal", pero cuando hago clic en él, va primero a la página ViewExpired y luego tengo que hacer clic de nuevo para ir a la página principal. ¿Cómo puedo ir directamente a la página principal sin hacer doble clic en el comando Enlace? – BRabbit27
En su lugar, conviértalo en '' que envía una nueva solicitud GET sin necesidad de visualizar el estado. No es necesario que envíe ningún dato junto con POST, ¿verdad? –
BalusC
Eso resolvió el problema, pero apareció otro. Si permanezco en la página de inicio de sesión, también está ocurriendo ViewExpiredException. ¿Cómo evitar eso? – BRabbit27