PDA

Visualizza la versione completa : [JAVA/JSP] Evento chiusura browser


bobc
22-12-2005, 15:48
salve a tutti,

Avrei un problema sulle servlet. In particolare dovrei gestire
connessioni da parte di più client. Ogni client ovviamente per accedere a determinate funzionalità deve fare il login e per uscire da queste, il logout (e qundi dovrei aggiornare una tabella che contiene gli utenti connessi). Alcune volte, però, l'utente può darsi che si dimentichi di fare il logout chiudendo automaticamente il browser. Qualcuno saprebbe dirmi come si cattura l'evento della chiusura del browser?
Grazie :)

floyd
22-12-2005, 15:53
non puoi :nonlodire

bobc
22-12-2005, 18:37
:(

Dovrei provvedere ad una soluzione alternativa...
Mi potreste dire se esiste qualche metodo che gestisca che sia trascorso un timeout di inattività dell'utente?
(dovrei associare a quest'evento la rimozione dell'utente dalla tabella delle connessioni!)
:cry:

floyd
22-12-2005, 18:50
imposta il timeout di sessione nel (mi sembra) web.xml

bobc
22-12-2005, 18:55
A questo timeout da settare in web.xml è associato qualche metodo che permetta ad ogni timeout trascorso di effettuare un operazione legata ad esso?

bobc
22-12-2005, 19:13
Dovrei rimuovere dei file temporanei legati a quella sessione anche!

V1RuZ
23-12-2005, 04:55
beh in realtà qualcosa potresti inventarti usando ajax e l'evento onUnLoad sul body del documento html,non so potrebbe essere un'idea...
L'evento onUnload chiama una funzione javascript che effettua una get o una post verso una servlet che fa quello che vuoi

floyd
23-12-2005, 10:29
certo che sì
se implementi HttpSessionListener (http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpSessionListener.html) e dichiari l'ascoltatore nel web.xml puoi eseguire un'azione nel metodo sessionDestroyed

bobc
23-12-2005, 15:33
grazie, dovrò provare.
Vi farò sapere ...

bobc
24-12-2005, 16:10
Breve resoconto:

codice servlet:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class ClienteServlet extends HttpServlet{
protected HttpSession session;
protected JdbcConnessioni jc;
protected HttpSessionListener listener;


public ClienteServlet(){
listener=new InactivityListener();
}

public void init(ServletConfig config)throws ServletException{
super.init(config);
jc=new JdbcConnessioni();
}

public void service(HttpServletRequest, HttpServletResponse){
...//operazioni varie
}
}

Associata alla servlet ho questa classe listener

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InactivityListener implements HttpSessionListener {
private ServletContext context=null;
private HttpSession session;

public InactivityListener(){}

public void sessionCreated(HttpSessionEvent event) {
if(context==null){
storeInServletContext(event);
}
}

public void sessionDestroyed(HttpSessionEvent event) {
JdbcConnessioni conn=(JdbcConnessioni)session.getAttribute("connessioni");
conn.rimuovi((String)session.getAttribute("user"));
context=null;
}.

private void storeInServletContext(HttpSessionEvent event) {
session = event.getSession();
context = session.getServletContext();
}
}

Quando gestisco una connessione singola funziona perfettamente, ma quando faccio più login, al timeout, mi rimuove solo l'ultimo utente (anche se il logout lo faccio con la sessione di un altro utente).
Forse sto dicendo una corbelleria, ma penso che si debba costruire una lista che contiene tanti oggetti listener per ogni HttpSession che viene creata.
Fatemi sapere...

Loading