2013-10-18 58 views
1

我在我的JSF應用程序中使用Iceface Icepush向客戶端發送一些通知。由於此會話超時從未發生在我的應用程序上。JSF會話超時並自動重定向到登錄頁面,無需用戶插入事件即使Ajax推送活動

我指定了會話超時15分鐘。我的要求是,如果15分鐘內沒有實際的客戶端交互,服務器應該使會話失效。

我確實在iceface論壇一些搜索並添加在web.xml這種情況下PARAM

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

也有人指定faces-config.xml中

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

但沒有任何工程使用sessionTimeoutMonitor 。

回答

0

我通過擴展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); 
} 

} 
1

您可以簡單地添加到您的主模板,這是由他人繼承擔保* .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每頁!

+0

謝謝。這是個好主意,但我不使用primefaces :-) – vels4j

相關問題