在JSF 2.3

时间:2018-08-07 18:48:55

标签: jsf websocket 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. 在极端情况下,请提供替代方法。

1 个答案:

答案 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" />

另请参见: