jsf - que - no se puede encontrar el caso de navegación coincidente del id de vista
el redireccionamiento de caras y el botón Atrás hacen que otros enlaces funcionen incorrectamente (1)
Básicamente, debe decirle al navegador que no almacene en caché las páginas JSF generadas dinámicamente mientras tiene el método de ahorro de estado de vista configurado en el server
(predeterminado). El estado de vista es rastreado por un campo <input type="hidden" name="javax.faces.ViewState">
en la forma de la página JSF generada con el identificador de estado de vista como valor de entrada. Cuando envía una página y navega a una página diferente, el estado de la vista se descarta en el servidor y ya no existe. Recuperar la página de la memoria caché del navegador aún le daría ese viejo identificador de estado de vista como valor de la entrada oculta. Enviar ese formulario no funcionará en absoluto, ya que no se puede encontrar ningún estado de vista en el servidor.
Desea obtener una nueva página nueva directamente desde el servidor en lugar de desde el caché del navegador. Para decirle al navegador que haga eso, crea un Filter
como este:
@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpRes = (HttpServletResponse) response;
if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpRes.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response);
}
// ...
}
De esta forma, el botón Atrás enviará una solicitud de HTTP completa que debe recrear el estado de la vista y dar como resultado una página con un formulario con el valor de campo oculto de estado de vista correcto.
Tengo una pregunta sobre la navegación de las caras.
Entonces tengo una página que toma un parámetro de solicitud para cargar un usuario específico. Esta página muestra una lista de commandLink que, cuando se hace clic en ella, redirige a otra página usando navegación implícita. El usuario se carga llamando a un método en "preRenderView".
La página a la que redirigimos también toma un parámetro de solicitud para determinar qué caso cargar. La página también está utilizando preRenderView.
Ambas páginas tienen beans con vista de ámbito.
Todo esto funciona increíble para el primer enlace que se presiona. La primera página redirige a la nueva URL y el caso se carga como se esperaba.
SIN EMBARGO, si hago clic en el botón Atrás del navegador y luego hago clic en otro enlace, la página NO redirige. Se actualiza (en cambio) y, obviamente, no compra el caso.
Después de la actualización, puedo hacer clic en un enlace y se redireccionará correctamente.
Ahora, todo esto funciona perfectamente cuando se guarda el bean de la primera página en la sesión, pero no quiero abusar del estado de la sesión y no creo que deba ser necesario que guarde esta información en la sesión.
Sé que puedo solucionar esto haciendo que la página se vuelva a cargar automáticamente cuando haga clic en el botón Atrás (porque la vista se volverá a crear), pero no estoy seguro de si esa es la solución correcta. (Tampoco estoy seguro de cómo forzaría esto)
¿Alguien tiene alguna sugerencia? Parece un caso de uso bastante común, pero no pude encontrar ningún ejemplo.
¡Gracias!