JSF会话超时并自动重定向到登录页面,无需用户干预,即使Ajax推送处于活动状态

JSF会话超时并自动重定向到登录页面,无需用户干预,即使Ajax推送处于活动状态,jsf,jsf-2,session-timeout,icefaces-3,icepush,Jsf,Jsf 2,Session Timeout,Icefaces 3,Icepush,我在JSF应用程序中使用Iceface向客户端发送一些通知。由于此会话,我的应用程序上永远不会发生超时 我已指定会话超时15分钟。我的要求是,若15分钟内并没有实际的客户端交互,服务器应该使会话无效 我在iceface论坛上做了一些搜索,并在web.xml中添加了这个上下文参数 <context-param> <param-name>org.icefaces.strictSessionTimeout</param-name> <param

我在JSF应用程序中使用Iceface向客户端发送一些通知。由于此会话,我的应用程序上永远不会发生超时

我已指定会话超时15分钟。我的要求是,若15分钟内并没有实际的客户端交互,服务器应该使会话无效

我在iceface论坛上做了一些搜索,并在web.xml中添加了这个上下文参数

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

org.icefaces.strictSessionTimeout
真的
还有人指定在faces-config.xml中使用sessionTimeoutMonitor

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

org.icefaces.impl.application.SessionTimeoutMonitor

但什么都不管用

我通过扩展
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);
}

}

我通过扩展
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):


一个提示-每页只能使用一个idleMonitor

您可以简单地添加到主模板中,该模板由其他受保护的*.xhtml文件继承(可能仅适用于PrimeFaces):

一个提示-每页只能使用一个idleMonitor