小编Kon*_*tin的帖子

在JSF 2.3中通知用户有关会话结束的信息

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

<session-config>
  <session-timeout>15</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

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

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

@PreDestroy
public void sessionTimeOut() {
    push.send("exitEvent");
}
Run Code Online (Sandbox Code Playgroud)

在页面上,分别是exit.xhtml -

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

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

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

但它只在页面加载时才有效,并且对会话结束时没有反应.
两个问题:

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

jsf websocket jsf-2.3

5
推荐指数
1
解决办法
537
查看次数

标签 统计

jsf ×1

jsf-2.3 ×1

websocket ×1