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



JavaEE、JSF-2.3、Websocket、WebApplication、WildFly
对于每个用户,都会创建一个会话,在其中进行操作、授权、身份验证等。在不活动15分钟后,由于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");
}

分别在页面上,exit.xhtml-

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

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

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

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

  1. 如何使用websocket处理会话结束
  2. 在极端情况下,提供一个替代方案

您的技术问题是没有在oneventonclose属性中指定函数引用。它就像:

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

onevent="functionName"
onclose="functionName"

其中functionName被定义为实函数:

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

javax.faces.Pushjavadoc:的事件部分解释了正确的方法

<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();
}
}

另请参阅:

  • 会话到期时自动在客户端执行操作
  • 在调用f:ajax侦听器之前和之后执行JavaScript

最新更新