似乎我在XPage中遇到了一个带有SessionListener实现的墙。监听器在创建会话时将输出打印到日志,因此我知道它已正确注册。但是,它在注销时不会调用sessionDestroyed。是否有任何特殊的URL重定向我需要执行才能在注销时立即销毁Domino / XPage会话?正如您所看到的,我已经尝试清除范围,并清除尝试启动sessionDestroyed方法的cookie。请注意,当我重新启动http服务器任务时会调用sessionDestroyed,因此似乎会话可能会延迟到非活动超时。
Dev Server是:9.0.1(64位,在Win7上本地运行) 运行基于会话的身份验证单服务器(注意:我尝试过基本身份验证,同样的问题)
注销实用程序方法(由SSJS调用):
public static void logout(){
String url = XSPUtils.externalContext().getRequestContextPath() + "?logout&redirectto=" + externalContext().getRequestContextPath();
XSPUtils.getRequest().getSession(false).invalidate();
//wipe out the cookies
for(Cookie cookie : getCookies()){
cookie.setValue("");
cookie.setPath("/");
cookie.setMaxAge(0);
XSPUtils.getResponse().addCookie(cookie);
}
try {
XSPUtils.externalContext().redirect(url);
} catch (IOException e) {
logger.log(Level.SEVERE,null,e);
}
}
简单会话监听器:
public class MySessionListener implements SessionListener {
public void sessionCreated(ApplicationEx arg0, HttpSessionEvent event) {
System.out.println("***sessionCreated***");
}
public void sessionDestroyed(ApplicationEx arg0, HttpSessionEvent event) {
System.out.println("***sessionDestroyed***");
}
}
答案 0 :(得分:5)
我们正在考虑将传统的http堆栈“?logout”行为与XPage运行时会话管理层相结合。目前,会话基于会话超时到期和/或http堆栈重启而被丢弃。如果要强制删除会话并调用SessionListener.sessionDestroyed,请参阅以下XSP片段 - 这同样适用于移植到Java:
<xp:button value="Logout" id="button2">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action>
<![CDATA[#{javascript:
// things we need...
var externalContext = facesContext.getExternalContext();
var request = externalContext.getRequest();
var response = externalContext.getResponse();
var currentContext = com.ibm.domino.xsp.module.nsf.NotesContext.getCurrent();
var session = request.getSession(false);
var sessionId = session.getId();
// flush the cookies and invalidate the HTTP session...
for(var cookie in request.getCookies()){
cookie.setValue("");
cookie.setPath("/");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
session.invalidate();
// now nuke the XSP session from RAM, then jump to logout...
currentContext.getModule().removeSession(sessionId);
externalContext.redirect("http://foo/bar.nsf?logout");
}]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>