wake-up-neo.com

Verhindern, dass der Benutzer eine zuvor besuchte gesicherte Seite nach dem Abmelden sieht

Ich habe die Anforderung, dass der Endbenutzer nach dem Abmelden/Abmelden nicht in der Lage ist, zu der eingeschränkten Seite zurückzukehren. Derzeit kann der Endbenutzer dies jedoch über die Zurück-Schaltfläche des Browsers tun, den Browserverlauf aufrufen oder sogar die URL erneut in die Adressleiste des Browsers eingeben.

Grundsätzlich möchte ich, dass der Endbenutzer nach dem Abmelden in keiner Weise auf die eingeschränkte Seite zugreifen darf. Wie kann ich das am besten erreichen? Kann ich den Zurück-Button mit JavaScript deaktivieren?

96
raaz

Sie können und sollten nicht ​​den Zurück-Button oder den Verlauf des Browsers deaktivieren. Das ist schlecht für die Benutzererfahrung. Es gibt JavaScript-Hacks, diese sind jedoch nicht zuverlässig und funktionieren auch nicht, wenn der Client JS deaktiviert hat.

Ihr konkretes Problem ist, dass die angeforderte Seite nicht direkt vom Server, sondern aus dem Browser-Cache geladen wurde. Dies ist im Wesentlichen harmlos, aber für den Endbenutzer in der Tat verwirrend, da er/sie fälschlicherweise denkt, dass es wirklich vom Server kommt.

Sie müssen nur den Browser anweisen, nicht ​​cache all die eingeschränkten JSP-Seiten (und damit nicht nur die Abmeldeseite/Aktion selbst!). Auf diese Weise wird der Browser gezwungen, die Seite vom Server anstatt vom Cache anzufordern, und daher werden alle Anmeldungsprüfungen auf dem Server ausgeführt. Verwenden Sie dazu ein Filter , das die erforderlichen Antwortheader in der doFilter() -Methode festlegt:

@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);
    }

    // ...
}

Ordnen Sie dieses Filter einem url-pattern von Interesse zu, z. B. *.jsp.

@WebFilter("*.jsp")

Wenn Sie diese Einschränkung nur für gesicherte Seiten festlegen möchten, sollten Sie ein URL-Muster angeben, das alle diese gesicherten Seiten abdeckt. Wenn sich beispielsweise alle im Ordner /app befinden, müssen Sie das URL-Muster von /app/* angeben.

@WebFilter("/app/*")

Darüber hinaus können Sie diesen Job in demselben Filter ausführen, in dem Sie die Anwesenheit des angemeldeten Benutzers überprüfen.

Vergessen Sie nicht, den Browser-Cache vor dem Testen zu leeren! ;)

Siehe auch:

133
BalusC

* .jsp in Url Pattern funktioniert nicht, wenn Sie eine Seite weiterleiten. Versuchen Sie auch, Ihr Servlet einzuschließen. Dadurch wird Ihre Anwendung vor diesem Problem mit dem Zurück-Button geschützt.

5
Sathyan

Die einfachste Möglichkeit, dies zu tun, ohne den Browser zu deaktivieren, besteht darin, diesen Code zum Ereignis page_load für die Seite hinzuzufügen, zu der der Benutzer nach dem Abmelden nicht zurückkehren möchte:

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
Ashraf Abusada

Der richtige Weg, dies zu tun, ist das Hinzufügen von

Vary: Cookie

header auf gesicherten Seiten. Wenn sich der Benutzer abmeldet, löschen Sie das Sitzungs-Cookie. Wenn sie nach dem Abmelden wieder zurück navigieren, wird der Browser-Cache nicht angezeigt. Dies hat auch den Vorteil, dass das Caching nicht vollständig besiegt wird.

0
Dan

Sie können dem Browser mitteilen, dass er die Startseite nicht zwischenspeichert (mit den entsprechenden Kopfzeilen - Expires, Cache-Control, Pragma). Aber es funktioniert nicht garantiert. Sie können ajax beim Laden der Seite an den Server anrufen, um zu prüfen, ob der Benutzer protokolliert ist.

0
Bozho