Monitoraggio della scadenza della sessione nel browser

Quindi, c'è quella complessa applicazione web eterogenea, con parti AJAX eseguite sia manualmente che da framework, più finestre pop-up, ecc. Un grande cliente rispettabile si avvicina con la richiesta di invalidare, chiudere o svolgere qualche altra attività su tutto il web finestre dell'applicazione quando la sessione HTTP scade. Si spera che tu sappia come controllare l'intervallo di timeout della sessione HTTP, per un'applicazione Web conforme a J2EE viene eseguita da un file web.xml (tuttavia in molti server di app non è fatto in modo standard). Per un time-out di 10 minuti è:

  10  

Il requisito del cliente non è affatto assurdo e ha perfettamente senso dal punto di vista dell'utente finale, ma può diventare un terribile dolore per uno sviluppatore perché: 1. Non puoi semplicemente avviare un conto alla rovescia nella finestra del browser ogni volta che viene caricata la pagina per chiudere la finestra al timeout. Questo approccio ha funzionato in un mondo non AJAX quando ogni interazione browser-server ha comportato il ricaricamento della finestra del browser. 2. Non è possibile interrogare il server per verificare se la sessione HTTP è scaduta o meno, poiché ciascuna di queste query verrà trattata come un'interazione browser-server che prolunga la sessione. Questo porterà a una sessione senza scadenza. 3. È possibile creare un'applicazione Web separata tenendo conto della sessione HTTP dell'applicazione Web principale e intersecandosi con essa. Ma questo è eccessivoe le possibilità che tale soluzione venga accettata sono estremamente basse a causa dei probabili problemi di integrazione. 4. Potresti provare ad intercettare tutte le interazioni browser-server AJAX con un codice avanzato simile a un hack, e questo ti aiuterà a gestire la tua finestra corrente. Ma questo non funziona per il caso di più finestre aperte: semplicemente non puoi comunicare tra le finestre del browser. L'unico modo per parlare con una finestra aperta da una finestra principale è utilizzare il riferimento JavaScript di un'altra finestra e una volta che la finestra principale viene ricaricata o indirizzata a una posizione diversa, perde tutti i riferimenti JavaScript ad altre finestre. 5. L'approccio più realistico è fare richieste periodiche JavaScript XMLHTTP (da ogni finestra aperta) al server ogni {intervallo massimo di inattività della sessione} +10 secondi. Questo alla fine chiuderà tutte le finestre,ma può comportare la chiusura delle finestre in minuti (o anche ore a seconda dell'impostazione del timeout della sessione dell'app Web) dopo che la sessione HTTP viene distrutta, ad esempio una volta che l'utente si disconnette dalla finestra principale. Non ci sono più opzioni a disposizione, sei frustrato e pensi che sia il momento giusto per prendere la pistola di tuo padre e sparare ai tuoi compagni di classe a scuola domani. No, non ancora ragazzino - c'è ancora una via d'uscita! L'uscita non è molto semplice, ma è molto elegante. I cookie ci aiuteranno. Si potrebbe pensare che il tempo di scadenza dei cookie possa fare il trucco. Purtroppo, come descritto inÈ proprio il momento giusto per prendere la pistola di tuo padre e sparare ai tuoi compagni di classe a scuola domani. No, non ancora ragazzino - c'è ancora una via d'uscita! L'uscita non è molto semplice, ma è molto elegante. I cookie ci aiuteranno. Si potrebbe pensare che il tempo di scadenza dei cookie possa fare il trucco. Purtroppo, come descritto inÈ proprio il momento giusto per prendere la pistola di tuo padre e sparare ai tuoi compagni di classe a scuola domani. No, non ancora ragazzino - c'è ancora una via d'uscita! L'uscita non è molto semplice, ma è molto elegante. I cookie ci aiuteranno. Si potrebbe pensare che il tempo di scadenza dei cookie possa fare il trucco. Purtroppo, come descritto in

Questo

articolo, non puoi fare affidamento sul tempo di scadenza del cookie poiché viene misurato da un browser client e nessuno può garantire che l'orologio di sistema del client non sia indietro di un anno. Quindi, ecco il sistema e il metodo per tenere traccia dei timeout delle sessioni HTTP nelle applicazioni Web eterogenee. Ad ogni richiesta effettuata da un browser a un server vengono impostati due cookie da un filtro servlet. Uno contiene l'ora corrente del server e un altro contiene l'ora di scadenza della sessione. L'ora corrente del server è necessaria solo per calcolare un offset tra client e server. L'ora di scadenza della sessione viene quindi controllata periodicamente rispetto all'ora del server corrente _calculated_ (ricorda l'offset). Ogni volta che viene effettuata una richiesta _any_ al server, il cookie dell'ora di scadenza viene aggiornato e tutto funziona. In pratica questo metodo si realizza in soli tre passaggi: 1.Crea un filtro servlet che filtrerebbe ogni richiesta alla tua applicazione web. Configuralo in web.xml in questo modo:

  SessionTimeoutCookieFilter some.package.SessionTimeoutCookieFilter   SessionTimeoutCookieFilter /*  

Non preoccuparti delle prestazioni della tua app web: questo filtro è MOLTO primitivo, tutto ciò che fa è aggiungere due cookie alla risposta:

 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse httpResp = (HttpServletResponse) resp; HttpServletRequest httpReq = (HttpServletRequest) req; long currTime = System.currentTimeMillis(); long expiryTime = currTime + session.getMaxInactiveInterval() * 1000; Cookie cookie = new Cookie("serverTime", "" + currTime); cookie.setPath("/"); httpResp.addCookie(cookie); if (httpReq.getRemoteUser() != null) { cookie = new Cookie("sessionExpiry", "" + expiryTime); } else { cookie = new Cookie("sessionExpiry", "" + currTime); } cookie.setPath("/"); httpResponse.addCookie(cookie); filterChain.doFilter(req, resp); } 

L'impostazione del percorso (a "/" nel nostro caso) è molto importante. Se ometti l'impostazione del percorso, il browser lo calcolerà automaticamente dall'URL, il che si tradurrà in un caos nella memorizzazione dei cookie del browser. 2. Abbiamo bisogno di un piccolo JavaScript su ogni finestra per calcolare l'offset tra l'ora del server e quella del client. Deve essere eseguito solo una volta, ma non sarebbe male eseguirlo a ogni caricamento della pagina:

 function calcOffset() { var serverTime = getCookie('serverTime'); serverTime = serverTime==null ? null : Math.abs(serverTime); var clientTimeOffset = (new Date()).getTime() - serverTime; setCookie('clientTimeOffset', clientTimeOffset); } window.onLoad = function() { calcOffset(); }; 

3. Infine, abbiamo bisogno di una funzione che verifichi effettivamente se la sessione è scaduta. Deve essere eseguito periodicamente, nel nostro caso ogni 10 secondi (o 10000 millisecondi):

 function checkSession() { var sessionExpiry = Math.abs(getCookie('sessionExpiry')); var timeOffset = Math.abs(getCookie('clientTimeOffset')); var localTime = (new Date()).getTime(); if (localTime - timeOffset > (sessionExpiry+15000)) { // 15 extra seconds to make sure window.close(); } else { setTimeout('checkSession()', 10000); } } 

In effetti, la chiusura delle finestre del browser alla scadenza della sessione è pura brutalità e può e deve essere accompagnata da un messaggio di avviso che appare 1 minuto prima del timeout della sessione. Sono davvero interessato a ricevere il tuo

feedback critico

sul mio metodo.

Questa storia, "Tracciamento della scadenza della sessione nel browser" è stata originariamente pubblicata da JavaWorld.