Evitar que el usuario vea la página segura visitada anteriormente después de cerrar sesión
Tengo el requisito de que el usuario final no pueda volver a la página restringida después de cerrar sesión. Pero actualmente el usuario final puede hacerlo mediante el botón Atrás del navegador, visitando el historial del navegador o incluso volviendo a ingresar la URL en la barra de direcciones del navegador.
Básicamente, quiero que el usuario final no pueda acceder a la página restringida de ninguna manera después de cerrar sesión. ¿Cómo puedo lograr esto de la mejor manera? ¿Puedo desactivar el botón Atrás con JavaScript?
Puedes y no debes desactivar el botón Atrás o el historial del navegador. Eso es malo para la experiencia del usuario. Existen trucos de JavaScript, pero no son confiables y tampoco funcionarán cuando el cliente tiene JS deshabilitado.
Su problema concreto es que la página solicitada se carga desde la memoria caché del navegador en lugar de directamente desde el servidor. Esto es esencialmente inofensivo, pero de hecho confuso para el usuario final, porque piensa incorrectamente que realmente proviene del servidor.
Sólo necesita indicarle al navegador que no almacene en caché todas las páginas JSP restringidas (y, por lo tanto, no solo la página/acción de cierre de sesión en sí). De esta manera, el navegador se ve obligado a solicitar la página desde el servidor en lugar de desde la memoria caché y, por lo tanto, se ejecutarán todas las comprobaciones de inicio de sesión en el servidor. Puedes hacer esto usando un filtro que establece los encabezados de respuesta necesarios en el doFilter()
método:
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);
}
// ...
}
Mapee esto Filter
en un sitio url-pattern
de interés, por ejemplo *.jsp
.
@WebFilter("*.jsp")
O si desea imponer esta restricción solo a páginas seguras, debe especificar un patrón de URL que cubra todas esas páginas seguras. Por ejemplo, cuando están todos en la carpeta /app
, debe especificar el patrón de URL de /app/*
.
@WebFilter("/app/*")
Aún más, puede hacer este trabajo de la misma Filter
manera que verifica la presencia del usuario que inició sesión.
¡No olvide borrar el caché del navegador antes de realizar la prueba! ;)
Ver también:
- Filtro de autenticación y servlet para iniciar sesión.
- ¿Cómo controlar el almacenamiento en caché de páginas web en todos los navegadores?
*.jsp en Patrón de URL no funcionará si reenvía una página. Intente incluir su servlet también... eso hará que su aplicación esté segura contra este problema del botón Atrás.
La forma más sencilla de hacerlo sin deshabilitar el botón Atrás del navegador es agregando este código al page_load
evento de la página a la que no desea que el usuario regrese después de cerrar sesión:
if (!IsPostBack)
{
if (Session["userId"] == null)
{
Response.Redirect("Login.aspx");
}
else
{
Response.ClearHeaders();
Response.ClearContent();
Response.Clear();
Session.Abandon();
Session.Remove("\\w+");
Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
Response.AddHeader("Pragma", "no-cache");
Response.AddHeader("Expires", "0");
}
}