使用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的正确密钥。我尝试了id
,SessionId
没有成功。 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?
也许你可以使用经典的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());
}
}