Możesz i nie powinieneś wyłączać przycisku wstecz lub historii przeglądarki. To źle wpływa na wrażenia użytkownika. Istnieją hacki JavaScript, ale nie są one niezawodne i nie będą działać, gdy klient ma wyłączony JS.
Twoim konkretnym problemem jest to, że żądana strona została załadowana z pamięci podręcznej przeglądarki, a nie prosto z serwera. Jest to zasadniczo nieszkodliwe, ale w rzeczywistości dezorientujące dla użytkownika końcowego, ponieważ błędnie uważa, że tak naprawdę pochodzi z serwera.
Wystarczy poinstruować przeglądarkę, aby nie buforowała wszystkich zastrzeżonych stron JSP (a więc nie tylko samej strony wylogowania / akcji!). W ten sposób przeglądarka jest zmuszona zażądać strony z serwera zamiast z pamięci podręcznej, a zatem wszystkie testy logowania na serwerze zostaną wykonane. Możesz to zrobić za pomocą filtru, który ustawia niezbędne nagłówki odpowiedzi w doFilter()
metodzie:
@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);
}
// ...
}
Na przykład mapuj to Filter
na url-pattern
interesujący Cię obiekt *.jsp
.
@WebFilter("*.jsp")
Lub jeśli chcesz umieścić to ograniczenie tylko na zabezpieczonych stronach, powinieneś określić wzorzec adresu URL obejmujący wszystkie te zabezpieczone strony. Na przykład, gdy wszystkie znajdują się w folderze /app
, musisz określić wzorzec adresu URL /app/*
.
@WebFilter("/app/*")
Co więcej, możesz wykonać tę pracę w taki sam sposób, Filter
jak sprawdzasz obecność zalogowanego użytkownika.
Nie zapomnij wyczyścić pamięci podręcznej przeglądarki przed testowaniem! ;)
Zobacz też: