Auditar entrada e saída de um usuário no sistema

Olá amigos, preciso fazer uma auditoria ou melhor um logger dos usuários do meu sistema. Preciso gravar na entrada do sistema o login do usuário, o ip da maquina que solicitou a entrada e a data e hora (timestamp) que o cara entrou e jogar o JavaBean com estes valores num atributo de sessão.

Depois, qdo o cara fazer o logout ou expirar a conexão, devo pegar da sessão o JavaBean e gravar o horário que ele saiu.

O meu problema está sendo esta ultima parte. Eu tinha pensado em colocar num listener que implementa o HttpSessionListener, e no seu método sessionDestroyed fazer isto> Porém qdo eu chego neste método, a minha sessão já foi destruida e não consigo mais pegar o JavaBean da sessão.

De que maneira eu poderia fazer isto? Existe um método beforeSessionDestroi ?

Como posso resolver este problema ?

Olá, consegui fazer fazendo meu Listener implementar o HttpSessionAttributeListener… Agora estou preciando apenas fazer pegar o IP do usuário…

public class LoggerListener implements HttpSessionAttributeListener {
	private HttpSessionBindingEvent evt;
	
	private void logarEntrada() {
		HttpSession session = evt.getSession();
		try {
			Logger logBEAN = new Logger();
			LoggerDAO logDAO = new LoggerDAO();		
			logBEAN.setUserid(this.evt.getValue().toString());
			logBEAN.setDtentrada(new Timestamp(System.currentTimeMillis()));
			logBEAN.setIp("teste");
			logDAO.login(logBEAN);
			session.setAttribute("_LOGGER", logBEAN);
		} catch (Exception e) {
			System.out.println("------------------------------------------------");
			System.out.println("ERRO ao fazer o logger (index.jsp): "+ e.getMessage());
			System.out.println("------------------------------------------------");
		}	
	}
	private void logarSaida() {
		try {
			Logger bean = (Logger) this.evt.getValue();
			bean.setDtsaida(new Timestamp(System.currentTimeMillis()));
			LoggerDAO dao = new LoggerDAO();
			dao.logout(bean);
		} catch (Exception e) {
			System.out.println("------------------------------------------------");
			System.out.println("ERRO (LoggerListner.java): "+ e.getMessage() );
			System.out.println("------------------------------------------------");
		}		
	}
	public void attributeAdded(HttpSessionBindingEvent evt) {
		this.evt = evt;
		if ("j_username".equals(evt.getName())) {
			this.logarEntrada();
		}		
	}

	public void attributeRemoved(HttpSessionBindingEvent evt) {
		this.evt = evt;
		if ("_LOGGER".equals(evt.getName())) {
			this.logarSaida();
		}
	}

	public void attributeReplaced(HttpSessionBindingEvent evt) {
		this.evt = evt;
		if ("j_username".equals(evt.getName())) {
			this.logarSaida();
			this.logarEntrada();
		}		
	}
}