jsp - strut - Evite que el usuario vea la página segura visitada previamente después del cierre de sesión
struts servlet (5)
Tengo el requisito de que el usuario final no pueda volver a la página restringida después de cerrar sesión / cerrar sesión. Pero actualmente el usuario final puede hacer eso con 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 la sesión. ¿Cómo puedo lograr esto de la mejor manera? ¿Puedo desactivar el botón Atrás con JavaScript?
* .jsp en Url Pattern no funcionará si reenvía una página. Trate de incluir su servlet también ... eso protegerá su aplicación de este problema de botón de retroceso.
La forma correcta de hacerlo es agregar
Vary: Cookie
encabezado en páginas seguras. Cuando el usuario cierra sesión, borre su cookie de sesión. Luego, cuando naveguen hacia atrás después de cerrar la sesión, la memoria caché del navegador se perderá. Esto también tiene el beneficio de no derrotar por completo el almacenamiento en caché.
La forma más sencilla de hacerlo sin desactivar el botón de la parte posterior del navegador es agregar este código al evento page_load
para la página en la que no desea que el usuario regrese después de cerrar la sesión:
if (!IsPostBack)
{
if (Session["userId"] == null)
{
Response.Redirect("Login.aspx");
}
else
{
Response.ClearHeaders();
Response.AddHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate");
Response.AddHeader("Pragma", "no-cache");
}
}
Puede y no debe desactivar el botón de retroceso del navegador o el historial. 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 ha cargado desde el caché del navegador en lugar de directamente desde el servidor. Esto es esencialmente inofensivo, pero de hecho confunde al usuario final, porque piensa incorrectamente que realmente proviene del servidor.
Solo tiene que indicarle al navegador que no almacene en caché todas las páginas JSP restringidas (¡y no solo la página / acción de cierre de sesión en sí misma!). De esta forma, 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. Puede hacerlo utilizando un Filter que establece los encabezados de respuesta necesarios en el método doFilter()
:
@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);
}
// ...
}
Asigne este Filter
a un 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 las páginas seguras. Por ejemplo, cuando están todos en la carpeta /app
, entonces necesita especificar el patrón de URL de /app/*
.
@WebFilter("/app/*")
Aún más, puede hacer este trabajo en el mismo Filter
que cuando está verificando la presencia del usuario que inició sesión.
¡No olvide limpiar el caché del navegador antes de probarlo! ;)
Ver también:
Puede intentar decirle al navegador que no almacene en caché la página de inicio (usando los encabezados correspondientes: Expira, Cache-Control, Pragma). Pero no se garantiza que funcione. Lo que puede hacer es hacer una llamada ajax al servidor en la carga de la página para verificar si el usuario está conectado, y si no, redireccionarlo.