È possibile verificare le sessioni scadute controllando se HttpServletRequest#getRequestedSessionId()
non restituisce null
(il che significa che il client ha inviato un cookie di sessione e quindi presuppone che la sessione sia ancora valida) e HttpServletRequest#isRequestedSessionIdValid()
restituisce false
(che significa che la sessione è scaduta dal lato server).
In un dado:
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);
}
}
Non c'è bisogno di complicarsi la vita con i biscotti in più. Mappa questo Filter
su un url-pattern
che copre le pagine protette (e quindi escludendo le pagine sessionexpired e login!).
Non dimenticare di disabilitare il caching delle pagine dal browser sulle pagine protette, altrimenti il browser le carica dalla cache quando torni nella cronologia del browser, invece di inviare una nuova richiesta al server. È possibile ottenere ciò facendo quanto segue nello stesso filtro, prima della chiamataChain#doFilter()
.
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.
Grazie. Ho intenzione di implementarlo. – Prabhat
se provo a ricreare un cookie usando il plugin firefox webdeveloper, il codice potrebbe fallire. –