代码之家  ›  专栏  ›  技术社区  ›  Constantine

在JSF 2.3中通知用户会话结束

  •  5
  • Constantine  · 技术社区  · 7 年前

    JavaEE、JSF-2.3、Websocket、WebApplication、WildFly。
    对于每个用户,都会创建一个会话,在其中操作、授权、身份验证等。由于设置为 web.xml文件 -

    <session-config>
      <session-timeout>15</session-timeout>
    </session-config>
    

    在JSF-2.3可用的WebSocket中,所以我决定这么做 Java语言 -

    @Inject
    @Push(channel = "exit")
    PushContext push;
    
    @PreDestroy
    public void sessionTimeOut() {
        push.send("exitEvent");
    }
    

    分别在页面上, Ext.xHTML -

    <h:form >
      <f:websocket channel="exit" scope="session">
        <f:ajax event="exitEvent" onevent="PF('dlg1').show()"/>
      </f:websocket>
    </h:form>
    

    在会议结束时,根据日志判断 sessionTimeOut() 方法有效,它仍然 @PreDestroy ,但页面上没有响应。
    为了测试,我在 Ext.xHTML 页面,单击 会话超时() 方法被调用。单击此按钮时,事件“ExtEvEnter”按预期执行,调用PrimeFress脚本。 PF('dlg1').show() ,将显示一个对话框。
    我怀疑websockets被杀的时间比 @Predestroy 方法被调用。
    websocket还有另一个选项,如下所示:

    <h:form >
      <f:websocket channel="exit" scope="session" onclose="PF('dlg1').show()"/>
    </h:form>
    

    但它只在页面加载时工作,并且在会话结束时没有任何反应。
    两个问题:

    1. 如何使用websockets处理会话结束?
    2. 在极端情况下,提供另一种选择。
    1 回复  |  直到 7 年前
        1
  •  11
  •   BalusC    7 年前

    你的技术问题是你没有指定一个函数 参考 在里面 onevent onclose 属性。就像是:

    onevent="function() { PF('dlg1').show() }"
    onclose="function() { PF('dlg1').show() }"
    

    onevent="functionName"
    onclose="functionName"
    

    哪里 functionName 定义为实函数:

    function functionName() {
        PF('dlg1').show();
    }
    

    正确的方法在 Events section of javax.faces.Push javadoc :

    <f:websocket channel="exit" scope="session" 
        onclose="function(code) { if (code == 1000) { PF('dlg1').show() }}" />
    

    <f:websocket channel="exit" scope="session"  onclose="exitListener" />
    

    function exitListener(code) {
        if (code == 1000) {
            PF('dlg1').show();
        }
    }
    

    另见: