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 Filter
einem url-pattern
von 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 Filter
ausführen, wie Sie die Anwesenheit des angemeldeten Benutzers überprüfen.
Vergessen Sie nicht, den Browser-Cache vor dem Testen zu leeren! ;)
Siehe auch: