Impedir visualizar páginas a través del historial

Otra vez, jruben :)
¿Cómo puedo impedir que un usuario sin estar logueado acceda a una página para la que se necesita login a través del historial o tecleándola en la barra de direcciones?
He visto por ahí que usando filtros, pero lo cierto es que no funciona como yo deseo.
Los filtros me han sido útiles para que si la sesión del usuario expira y se pulsa cualquier enlace o botón de la aplicación dentro de la cuenta de usuario, al no haber ya sesión el filtro te redireccione a la página de inicio (así lo tengo yo), pero lo cierto es que no se consigue ese efecto cuando utilizas una dirección del historial. He observado haciendo pruebas que en cierto modo sí funciona, porque cuando introduces la dirección de una página que no ha sido aún cargada por nadie te redirecciona donde manda el filtro (al menos eso deduzco de mis pruebas), pero si dicha página ya ha sido cargada antes, el filtro no funciona y la página se visualiza cuando no debería. Ni siquiera se ejecuta el código del filtro. No se ejecuta ninguna lógica, por lo que difícilmente puede impedirse la visualización. Supongo que puede deberse a que la página está en cache y se carga, no pasa por ningún tipo de lógica, de forma que puedes visualizar algo que pertenece a otro usuario anterior (quizá confidencial), y precisamente eso es lo que quería evitar con el filtro pero no ha habido manera. ¿Sabes cómo se puede solucionar esto?
Te pongo el código del filtro por si acaso, pero creo que está bien
En el web.xml
<filter>
<filter-name>identificacionFilter</filter-name>
<filter-class>proyecto.IdentificacionFilter</filter-class>
<init-param>
<param-name>homePage</param-name>
<param-value>/index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>identificacionFilter</filter-name>
<url-pattern>/user/*</url-pattern>
<dispatcher>ERROR</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
(He puesto los 4 dispatcher por "asegurar" más, aunque realmente no sé muy bien su cometido)
Y la clase IdentificacionFilter
public class IdentificacionFilter implements Filter {
private FilterConfig filterConfig = null;
private String homePage = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.homePage = filterConfig.getInitParameter("homePage");
}
public void destroy() {
this.filterConfig = null;
this.homePage = null;
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    boolean acceso = false;
    HttpSession session = null;
    if (req instanceof HttpServletRequest) {
        session = ((HttpServletRequest) req).getSession(false);
        if (session != null) {
            if (session.getAttribute("usuarioContainer") != null) {
                acceso = true;
            }
        }
    }
    if (acceso) {
        chain.doFilter(req, resp);
        return;
    }
    else {
        if (this.getFilterConfig() != null) {
            if ((this.getHomePage() != null) && (!this.getHomePage().equals(""))) {
                this.getFilterConfig().getServletContext().getRequestDispatcher(this.getHomePage()).forward(req, resp);
                return;
            }
        }
    }
    throw new ServletException("Unauthorized access, unable to forward to login page");
}
public FilterConfig getFilterConfig() {
return this.filterConfig;
}
public void setFilterConfig(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public String getHomePage() {
return this.homePage;
}
public void setHomePage(String homePage) {
this.homePage = homePage;
}
}

1 respuesta

Respuesta
1
Hay una opción que puedes seleccionar para obligar a cargar las páginas cuando accedes a ella, en vez de que las coja de la cache, con esto si que te funcionaria el filtro
¿E impidiendo que se guarden en el historial? ¿Es una buena solución? ¿Cómo se haría eso? Se me acaba de ocurrir ahora, pero no sé si tiene otras desventajas :)
¿Y no sabes qué opción es? Ni siquiera sé si te refieres al navegador, servidor, algún archivo de mi aplicación... :)
Pues teóricamente, en la cabecera, poner algo así:
CONTENT="no-cache"
Pero he estado leyendo y dice que no es del todo efectivo.
Hola jruben!
Salí de viaje el 17 y he regresado hoy. Estoy leyendo ahora tu respuesta. Me pondré con tu sugerencia en cuanto pueda y te diré lo que sea o finalizaré la pregunta.
Un saludo
Vale
Me parece que al final lo he conseguido, aunque trabajo me ha costado!
A partir de tu sugerencia de poner eso en la cabecera, busqué en la red. En cantidad de sitios figuraba que debían usarse las etiquetas meta para limpiar la caché, incluso repetir una etiqueta de esas en el final del documento, pero no me funcionaba. Probé con response. setHeader("Cache-Control", "no-cache"), response. setHeader("Pragma", "no-cache"), y response.setDateHeader("Expires", 0), las sentencias equivalentes a las etiquetas meta, pero seguía sin lograr nada. Me planteé que no fuese problema de caché, pero cuando a través del navegador la limpiaba, funcionaba. El caso es que al final, en uno de los muchos foros y páginas que he mirado y leído, alguien apuntó no utilizar esto en la jsp sino en el servlet, y parece que puesto en el código de la action funciona
De momento, y espero que así siga, está solucionado
Un saludo y gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas