Vous pouvez et ne devriez pas désactiver le bouton de retour du navigateur ou l'historique. C'est mauvais pour l'expérience utilisateur. Il existe des astuces JavaScript, mais elles ne sont pas fiables et ne fonctionneront pas non plus lorsque le client a désactivé JS.
Votre problème concret est que la page demandée est chargée à partir du cache du navigateur au lieu d'être directement du serveur. C'est essentiellement sans danger, mais en effet cela peut être déroutant pour l'utilisateur final, car il pense à tort que cela vient vraiment du serveur.
Il vous suffit d'instruire le navigateur de ne pas mettre en cache toutes les pages JSP restreintes (et donc pas seulement la page/action de déconnexion elle-même!). De cette façon, le navigateur est obligé de demander la page au serveur au lieu du cache et donc tous les contrôles de connexion sur le serveur seront exécutés. Vous pouvez faire cela en utilisant un Filter qui définit les en-têtes de réponse nécessaires dans la méthode 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);
}
// ...
}
Associez ce Filter
à un url-pattern
d'intérêt, par exemple *.jsp
.
@WebFilter("*.jsp")
Ou si vous souhaitez appliquer cette restriction uniquement aux pages sécurisées, vous devez spécifier un modèle d'URL qui couvre toutes ces pages sécurisées. Par exemple, s'ils sont tous dans le dossier /app
, alors vous devez spécifier le modèle d'URL de /app/*
.
@WebFilter("/app/*")
De plus, vous pouvez faire ce travail dans le même Filter
que celui où vous vérifiez la présence de l'utilisateur connecté.
N'oubliez pas de vider le cache du navigateur avant de tester ! ;)
Voir aussi :
7 votes
Utiliser le modèle Post-request-get. Googlez-le.