JavaEE、JSF-2.3、Websocket、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 结束没有反应时才起作用。
两个问题:
最佳答案
您的技术问题是您没有指定函数 引用 在 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();
}
}
也可以看看:关于jsf - 在 JSF 2.3 中通知用户 session 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733539/