I wrote my own timeout monitor by extending the org.icefaces.impl.application.SessionTimeoutMonitor
class and this works fine.
public class RWSessionTimeoutMonitor extends SessionTimeoutMonitor{
private static Logger log = LoggerFactory.getLogger(RWSessionTimeoutMonitor.class);
public RWSessionTimeoutMonitor(ResourceHandler handler) {
super(handler);
}
@Override
public boolean isResourceRequest(FacesContext context) {
final ExternalContext externalContext = context.getExternalContext();
//create session if non-ajax request
final Object session = externalContext.getSession(!context.getPartialViewContext().isAjaxRequest());
//if session invalid or expired block other resource handlers from running
if (session == null) {
//return false to force JSF to run and throw ViewExpiredException which eventually will be captured
//and re-cast in a SessionExpiredException
return false;
}
if (!EnvUtils.isStrictSessionTimeout(context)) {
return getWrapped().isResourceRequest(context);
}
Map sessionMap = externalContext.getSessionMap();
Long lastAccessTime = (Long) sessionMap.get(SessionTimeoutMonitor.class.getName());
boolean isPushRelatedRequest = EnvUtils.isPushRequest(context);
if (lastAccessTime == null || !isPushRelatedRequest) {
lastAccessTime = System.currentTimeMillis();
sessionMap.put(SessionTimeoutMonitor.class.getName(), System.currentTimeMillis());
}
int maxInactiveInterval;
maxInactiveInterval = ((javax.servlet.http.HttpSession) session).getMaxInactiveInterval();
if (System.currentTimeMillis() - lastAccessTime > maxInactiveInterval * 1000) {
sessionMap.remove(SessionTimeoutMonitor.class.getName());
externalContext.invalidateSession();
log.info("No user request b/w max interval [{}], session is invalidated." , maxInactiveInterval );
}
return super.isResourceRequest(context);
}
}