Verhindern Sie, dass Benutzer die zuvor besuchte gesicherte Seite nach dem Abmelden sehen


99

Ich habe die Anforderung, dass der Endbenutzer nach dem Abmelden / Abmelden nicht zur eingeschränkten Seite zurückkehren kann. Derzeit kann der Endbenutzer dies jedoch über die Schaltfläche "Zurück" des Browsers, den Browserverlauf oder sogar durch erneutes Eingeben der URL in die Adressleiste des Browsers tun.

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


7
Verwenden Sie Post-Request-Get Pattern.Google it.

Antworten:


137

Sie können und sollten die Zurück-Schaltfläche oder den Verlauf des Browsers nicht deaktivieren. Das ist schlecht für die Benutzererfahrung. Es gibt JavaScript-Hacks, aber sie sind nicht zuverlässig und funktionieren auch nicht, wenn auf dem Client JS deaktiviert ist.

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 fälschlicherweise denkt, dass es wirklich vom Server kommt.

Sie müssen nur den Browser anweisen, nicht alle eingeschränkten JSP-Seiten (und damit nicht nur die Abmeldeseite / Aktion selbst!) Zwischenzuspeichern . Auf diese Weise wird der Browser gezwungen, die Seite vom Server anstatt vom Cache anzufordern, und daher werden alle Anmeldeprüfungen auf dem Server ausgeführt. Sie können dies mit einem Filter tun, der 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 dies beispielsweise Filtereinem url-patternvon Interesse zu *.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 befinden /app, müssen Sie das URL-Muster von angeben /app/*.

@WebFilter("/app/*")

Darüber hinaus können Sie diesen Job genauso Filterausführen, wie Sie die Anwesenheit des angemeldeten Benutzers überprüfen.

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

Siehe auch:


2
Manchmal reicht das nicht aus, ich erinnere mich an ein solches Problem. Der Browser merkt sich nur die letzte Seite. Aber es könnte
IE6

3
@Bozho: Entweder haben Sie einen unvollständigen Satz von Headern angegeben, oder der Browser hat die Seite noch im Cache.
BalusC

1
@ Chris: funktioniert für mich mit Firefox und allen anderen Browsern. Ihr Problem wird an anderer Stelle verursacht. Vielleicht haben Sie vergessen, einen Cache zu leeren? Oder sind diese Header auf die falschen Antworten gesetzt?
BalusC

@BalusC Ich habe eine separate Filterklasse erstellt, um die doFilter()Methode zu überschreiben . Wenn ich die Abmeldetaste drücke, wird sie zu einem Servlet umgeleitet, in dem ich die Sitzung ungültig mache. Ich bin mir nicht sicher, wie die doFilter()Methode hier ins Spiel kommt. Können Sie mir bitte sagen, wie ich das umsetzen soll? Wie in, die richtigen Schritte zu befolgen. Vielen Dank.
Anjan Baradwaj

Hat gut für mich funktioniert. Getestet nach beiden sendRedirect(...)und forward().
Hal50000

5

* .jsp im URL-Muster funktioniert nicht, wenn Sie eine Seite weiterleiten. Versuchen Sie auch, Ihr Servlet einzuschließen. Dadurch wird Ihre Anwendung vor diesem Problem mit der Zurück-Schaltfläche geschützt.


2

Der einfachste Weg, dies zu tun, ohne die Zurück-Schaltfläche des Browsers zu deaktivieren, besteht darin, diesen Code dem page_loadEreignis für die Seite hinzuzufügen, zu der der Benutzer nach dem Abmelden nicht zurückkehren soll:

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

6
Obwohl Ihre Antwort nützlich ist, veröffentlichen Sie bitte die Antwort, die sich auf die Programmiersprache des OP bezieht. Ihre C # -Lösung hilft im Java EE-Projekt des OP nicht weiter.
Buhake Sindi

0

Sie können versuchen, den Browser anzuweisen, die Homepage nicht zwischenzuspeichern (mithilfe der entsprechenden Überschriften - Expires, Cache-Control, Pragma). Es ist jedoch nicht garantiert, dass es funktioniert. Sie können beim Laden der Seite einen Ajax-Aufruf an den Server senden, um zu überprüfen, ob der Benutzer angemeldet ist, und wenn nicht, umleiten.


13
Aber wenn ein böser Verstand JavaScript deaktiviert, funktioniert dies nicht und er wird die Seite trotzdem sehen.
Acme

0

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

Vary: Cookie

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.