SessionListener sessionDestroyed未调用

时间:2014-02-20 14:39:03

标签: xpages

似乎我在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***");
}

}

1 个答案:

答案 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>