如何在preDestroyContext.SESSION期间从Contexts.getSession()获取JSESSIONID?

时间:2011-11-18 17:33:17

标签: jsf seam

使用JBoss AS 5.1,JSF 1.2和Seam 2.2,我正在尝试记录会话开放和关闭。

AFAIK,在org.jboss.seam.preDestroyContext.SESSION事件发生时,如果会话超时,没有FacesContext这似乎很自然,因为没有正在运行的HTTP请求,所以我无法获得会话来自它的ID。但是Contexts.getSession()还有一个Seam会话上下文。

当我动态检查调试器中的Contexts.getSession()对象时,我可以在某个内部JSESSIONID中看到Map。我想做点什么:

String sessionId = Contexts.getSession().get("JSESSIONID");

但显然,JSESSIONID不是检索会话ID的正确密钥。我尝试了idSessionId但没有成功。 SessionContext.getNames()方法返回键列表:

  • anonPersistentPermissionResolver
  • loggedUserId
  • org.jboss.seam.security.ruleBasedPermissionResolver
  • org.jboss.seam.web.session
  • com.sun.faces.application.StateManagerImpl.SerialId
  • org.jboss.seam.international.timeZoneSelector
  • org.jboss.seam.international.localeSelector
  • org.jboss.seam.security.defaultResolverChain
  • org.jboss.seam.security.persistentPermissionResolver
  • javax.faces.request.charset
  • crumbs
  • org.jboss.seam.core.conversationEntries
  • debateId
  • org.jboss.seam.security.credentials
  • com.sun.faces.logicalViewMap
  • org.jboss.seam.security.identity
  • org.jboss.seam.security.rememberMe

org.jboss.seam.web.session的值不包含会话ID。

如何从Contexts.getSession()获取会话ID?

1 个答案:

答案 0 :(得分:1)

也许您可以使用经典的HttpSessionListener来记录您需要的内容。放入你的web.xml:

...
<listener>
    <listener-class>com.yourcompany.YourSessionListener</listener-class>
</listener>
...

监听器实现如下:

package com.yourcompany;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.log4j.Logger;

public class YourSessionListener implements HttpSessionListener {   

    private static Logger log = Logger.getLogger(YourSessionListener.class);

    public void sessionCreated(HttpSessionEvent event) {
        log.info("creating http session: " + event.getSession().getId());                       
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        log.info("destroying http session: " + event.getSession().getId());        
    }   
}