Come posso ottenere un elenco di tutti gli oggetti HttpSession in un’applicazione Web?

Diciamo che ho un’applicazione Web in esecuzione Java con 0 o più oggetti HttpSession validi ad essa associati. Voglio un modo per accedere all’elenco corrente di oggetti HttpSession validi. Stavo pensando che potrei implementare un HttpSessionListener e usarlo per aggiungere un elenco di valori di ID di sessione che sono memorizzati in un attributo ambito dell’applicazione, ma poi sono al corrente dell’aggiornamento dell’elenco in quanto le sessioni sono invalidate e chi lo sa cos’altro.

Prima di iniziare a cucinare la mia soluzione ho pensato di fare la domanda:
L’API servlet fornisce alcuni mezzi per ottenere l’accesso all’elenco completo di oggetti di sessione non invalidati?

Sto utilizzando Tomcat 6.x come contenitore della mia applicazione web e la libreria MyFaces 1.2.x (JSF).

SOLUZIONE
Ho seguito un approccio simile a quello che BalusC ha discusso in queste domande esistenti:

  • Come implementare facilmente “chi è online” in Grails o applicazione Java?
  • JSF: come invalidare una sessione utente quando registra due volte con le stesse credenziali

Ho modificato dalla class SessionData per implementare HttpSessionBindingListener . Quando si verifica un evento di binding, l’object si aggiungerà o rimuoverà dal set di tutti gli oggetti SessionData .

 @Override public void valueBound(HttpSessionBindingEvent event) { // Get my custom application-scoped attribute ApplicationData applicationData = getApplicationData(); // Get the set of all SessionData objects and add myself to it Set activeSessions = applicationData.getActiveSessions(); if (!activeSessions.contains(this)) { activeSessions.add(this); } } @Override public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ApplicationData applicationData = getApplicationData(); Set activeSessions = applicationData.getActiveSessions(); if (activeSessions.contains(this)) { activeSessions.remove(this); } } 

L’unica cosa che continua a irritarmi è cosa succede quando Tomcat viene riavviato. A meno che Tomcat non sia stato configurato correttamente per NON serializzare le sessioni su disco, lo farà. Quando Tomcat si riavvia, gli oggetti HttpSession (e gli oggetti SessionData insieme a loro) vengono deserializzati e le sessioni vengono nuovamente rese valide. Tuttavia, la serializzazione / deserializzazione delimita totalmente gli eventi listener di HttpSession , quindi non ho la possibilità di SessionData con grazia il riferimento deserializzato a SessionData nel mio Set di oggetti gestito dopo il riavvio.

Non ho alcun controllo sulla configurazione di produzione di Tomcat nell’organizzazione del mio cliente, quindi non posso presumere che sarà fatto come mi aspetto.

La mia soluzione alternativa è quella di confrontare il tempo di creazione di HttpSession con il tempo di avvio dell’applicazione quando viene ricevuta una richiesta. Se la sessione è stata creata prima del tempo di avvio dell’applicazione, richiama invalidate() e l’utente viene inviato a una pagina di errore / avviso con una spiegazione di ciò che è accaduto.

Ottengo il tempo di avvio dell’applicazione implementando un ServletContextListener e memorizzando l’ora corrente all’interno di un object con ambito applicazione dal metodo contextInitialized() del listener.

No, l’API Servlet non fornisce un modo. Devi davvero metterli in pratica con l’aiuto di un HttpSessionListener . Puoi trovare diversi esempi nelle seguenti risposte:

  • Come trovare HttpSession di jsessionid?
  • Come trovare il numero di sessioni attive per IP?
  • Come verificare chi è online?
  • Come invalidare un’altra sessione quando un utente ha effettuato l’accesso due volte?

Non esiste un modo diretto. Dipende dalla distribuzione. Sopra fallirà una volta deciso di introdurre distribuzione distribuita e bilanciamento del carico.

Non proprio una risposta, ma nei buoni tempi c’era “javax.servlet.http.HttpSessionContext”, ma è stato rilasciato a partire dalla versione 2.1, esplicitamente senza alcuna sostituzione: https://tomcat.apache.org/tomcat- 5.5-doc / servletapi / javax / servlet / http / HttpSessionContext.html