jsf - 在 JSF 2.3 中通知用户 session 结束

标签 jsf websocket jsf-2.3

JavaEE、JSF-2.3、W​​ebsocket、WebApplication、WildFly。
对于每个用户,都会创建一个 session ,在该 session 中进行操作、授权、身份验证等。由于 的设置,在 15 分钟不活动后, session 会自动销毁web.xml -

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

在 JSF-2.3 中可用 WebSocket,所以我决定这样做 ExitBean.java -

@Inject
@Push(channel = "exit")
PushContext push;

@PreDestroy
public void sessionTimeOut() {
    push.send("exitEvent");
}

在页面上分别为退出.xhtml -

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

在 session 结束时,根据日志判断,sessionTimeOut()方法有效,它仍然是 @PreDestroy ,但页面上没有响应。
为了测试,我在 上放置了一个按钮。退出.xhtml 页面,点击sessionTimeOut()方法被调用。单击此按钮时,事件 - “exitEvent”按预期执行,调用 PrimeFaces 脚本 PF('dlg1').show() ,显示一个对话框。
我怀疑 websocket 甚至比 @Predestroy 更早被杀死。方法被调用。
websocket 还有另一个选项,它看起来像这样:

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

但它仅在页面加载并且对 session 结束没有反应时才起作用。
两个问题:
  • 如何使用 websockets 处理 session 结束?
  • 在极端情况下,提供替代方案。
  • 最佳答案

    您的技术问题是您没有指定函数 引用 oneventonclose属性。它是这样的:

    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();
        }
    }
    
    也可以看看:
  • Automatically perform action in client side when the session expires
  • Execute JavaScript before and after the f:ajax listener is invoked
  • 关于jsf - 在 JSF 2.3 中通知用户 session 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733539/

    相关文章:

    java - JSF 2.3 整个 bean 验证会丢弃所有字段。是故意的吗?难道是我用错了什么东西?

    java - 如何防止 JSF 中的硬编码依赖项?

    ios - 重新连接到 websockets 的适当时间间隔

    jsf - 如何在 "namespaced mode"中使用jsf

    jsf - 如何在 WildFly 上安装 JSF 2.3 (javax.faces.jar) 的一个 jar 变体

    node.js - OpenShift 上的 WebSockets 不适用于远程客户端

    java - 使用 GlassFish Server 时如何纠正模块部署错误?

    JSF:带参数的 Bean 方法调用

    hibernate - <h :selectOneMenu> and lazy loading from hibernate

    javascript - 当用户关闭浏览器时检测Websocket关闭连接?