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;
}
}
¿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 de jruben
1