@ApplicationScoped @Install
public class SessionClearerUserStatusListener implements UserStatusListener {
public void statusChanged(UserStatus us) {
if (us.isAnonymous()) { // just logout
RequestContext ctx = RequestContext.lookup();
HttpSession session = ctx.getRequest().getSessionObject();
Enumeration<String> en = session.getAttributeNames();
Set<String> attributesToDelete = new HashSet<String>();
while (en.hasMoreElements()) {
String attrName = en.nextElement();
Object obj = session.getAttribute(attrName);
if (obj == null || !(obj instanceof LogoutSurvivor)) {
attributesToDelete.add(attrName);
}
}
for (String attrName : attributesToDelete) {
session.removeAttribute(attrName);
}
try {
ctx.getRequest().getRequestObject().getSession().invalidate();
ctx.getRequest().getRequestObject().logout();
} catch (Throwable e) {
// Just ignore
}
}
}