Vous pouvez tester les sessions expirées en vérifiant si HttpServletRequest#getRequestedSessionId()
ne renvoie pas null
(ce qui signifie que le client a envoyé un cookie de session et suppose donc que la session est toujours valide) et HttpServletRequest#isRequestedSessionIdValid()
renvoie à false
(ce qui signifie que la session a expiré du côté du serveur).
Dans une noix :
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) {
response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp");
} else if (session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
} else {
chain.doFilter(request, response);
}
}
Pas besoin de s'embêter avec des biscuits supplémentaires. Cette carte Filter
sur un url-pattern
couvrant les pages protégées (et excluant donc les pages sessionexpirée et login !).
N'oubliez pas de désactiver la mise en cache des pages par le navigateur sur les pages protégées, sinon le navigateur web les chargera depuis le cache lorsque vous reviendrez en arrière dans l'historique du navigateur, au lieu d'envoyer une nouvelle requête au serveur. Vous pouvez y parvenir en faisant ce qui suit dans le même filtre, avant Chain#doFilter()
appeler.
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.