Puede y no debe desactivar el botón de retroceso o el historial del navegador. Eso es malo para la experiencia del usuario. Hay hacks de JavaScript, pero no son confiables y tampoco funcionarán cuando el cliente tenga JS deshabilitado.
Su problema concreto es que la página solicitada se cargó desde la caché del navegador en lugar de directamente desde el servidor. Esto es esencialmente inofensivo, pero de hecho confunde al usuario final, porque él / ella piensa incorrectamente que realmente proviene del servidor.
Solo 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 del servidor en lugar de la caché y, por lo tanto, se ejecutarán todas las comprobaciones de inicio de sesión en el servidor. Puede 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 lugar url-pattern
de interés, por ejemplo *.jsp
.
@WebFilter("*.jsp")
O si desea poner esta restricción solo en páginas seguras, debe especificar un patrón de URL que cubra todas esas páginas seguras. Por ejemplo, cuando todos están en la carpeta /app
, debe especificar el patrón de URL de /app/*
.
@WebFilter("/app/*")
Aún más, puede hacer este trabajo en el mismo lugar Filter
donde está verificando la presencia del usuario que inició sesión.
¡No olvide borrar la memoria caché del navegador antes de realizar la prueba! ;)
Ver también: