使用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?
答案 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());
}
}