Тайм-аут сеанса JSF и автоматическое перенаправление на страницу входа без вмешательства пользователя, хотя Ajax push активен

Я использую Iceface Icepush в своем приложении JSF для отправки некоторых уведомлений клиенту. Из-за этого тайм-аут сеанса никогда не происходит в моем приложении.

Я указал время ожидания сеанса 15 минут. Мое требование заключается в том, что сервер должен сделать недействительным сеанс, если в течение 15 минут не происходит никакого реального взаимодействия с клиентом.

Я провел поиск по форуму iceface и добавил этот контекстный параметр в web.xml.

<context-param>
    <param-name>org.icefaces.strictSessionTimeout</param-name>
    <param-value>true</param-value>
</context-param>

также кто-то указал использовать sessionTimeoutMonitor в Face-config.xml

<application>
 <resource-handler>org.icefaces.impl.application.SessionTimeoutMonitor</resource-handler>
</application>

Но ничего не работает.

2 ответа

Решение

Я написал свой собственный монитор времени ожидания, расширив org.icefaces.impl.application.SessionTimeoutMonitor класс, и это отлично работает.

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);
}

}

Вы можете просто добавить в свой основной шаблон, который наследуется другими защищенными *.xhtml файлами (возможно, работает ТОЛЬКО с PrimeFaces):

<p:idleMonitor timeout="600000">
    <p:ajax event="idle" listener="#{loggedBean.logOut()}" update="messagesIdle" />
 Or <p:ajax event="active" listener="#{messagesBean.showMessageInfo('Czy ta kawka nie była zbyt gorąca? :)')}" update="messagesIdle" />
</p:idleMonitor>

Один совет - вы можете использовать только один idleMonitor на страницу!

Другие вопросы по тегам