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>
但是它仅在页面加载并且对会话结束没有反应时才起作用。
两个问题:
答案 0 :(得分:10)
您的技术问题是您没有在df.set_index(keys=['idx1','idx2'], inplace=True, drop=False)
df['idx1_mod'] = df['idx'] + 100
或onevent
属性中指定功能引用。就像这样:
onclose
或
onevent="function() { PF('dlg1').show() }"
onclose="function() { PF('dlg1').show() }"
其中onevent="functionName"
onclose="functionName"
被定义为实函数:
functionName
正确的方法在Events section of javax.faces.Push
javadoc中进行了解释:
function functionName() {
PF('dlg1').show();
}
或
<f:websocket channel="exit" scope="session"
onclose="function(code) { if (code == 1000) { PF('dlg1').show() }}" />
<f:websocket channel="exit" scope="session" onclose="exitListener" />