Evitar que el usuario vea la página segura visitada previamente después de cerrar sesión


Tengo el requisito de que el usuario final no debe ser capaz de volver a la página restringida después de cerrar sesión/cerrar sesión. Pero actualmente, el usuario final puede hacerlo mediante el botón de retroceso 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?

Author: BalusC, 2010-11-16

5 answers

Usted 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 carga desde la caché del navegador en lugar de directamente desde el servidor. Esto es esencialmente inofensivo, pero de hecho confuso para el usuario final, porque él / ella piensa incorrectamente que realmente viene de la servidor.

Solo tiene que indicar al navegador que no cachee 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 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 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);
    }

    // ...
}

Mapear esto Filter en un url-pattern de interés, por ejemplo *.jsp.

@WebFilter("*.jsp")

O si desea poner esta restricción solo en las páginas seguras, entonces 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 Filter donde está verificando la presencia del usuario conectado.

No se olvide de borrar la caché del navegador antes de probar! ;)

Véase también:

 128
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:19

*.jsp en el patrón de Url no funcionará si reenvías una página. Trate de incluir su servlet también.. eso hará que su aplicación segura de este problema botón atrás.

 5
Author: Sathyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 14:35:45

La forma más sencilla de hacerlo sin deshabilitar el botón de regreso del navegador es agregando este código al evento page_load para 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.AddHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate");
            Response.AddHeader("Pragma", "no-cache");
        }
    }
 2
Author: Ashraf Abusada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 12:52:24

Puede intentar decirle al navegador que no almacene en caché la página de inicio (usando las cabeceras apropiadas - Caduca, Cache-Control, Pragma). Pero no está garantizado que funcione. Lo que puede hacer, es hacer una llamada ajax al servidor en la carga de la página para comprobar si el usuario está registrado, y si no - redireccionar.

 0
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-16 12:46:56

La forma correcta de hacer esto es agregar el

Vary: Cookie

Encabezado en páginas seguras. Cuando el usuario cierre la sesión, borre su cookie de sesión. Luego, cuando naveguen de regreso después de cerrar sesión, la caché del navegador se perderá. Esto también tiene la ventaja de no derrotar completamente el almacenamiento en caché.

 0
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-05 12:38:38