Java 如何检查JSF页面中是否有活动会话?

Java 如何检查JSF页面中是否有活动会话?,java,session,jsf,session-timeout,Java,Session,Jsf,Session Timeout,有一种方法可以直接在jsf页面中检查是否存在活动会话? 我尝试过这个,但不起作用: <p:ajaxStatus onerror="#{session == null ? 'idleDialog.show();' : null}" 在评估EL时,始终存在活动会话。如果在打开页面之前没有,则会自动创建该页面 在JSF中,由于所谓的“状态保存方法”,过期会话是一个问题。默认情况下,生成页面的状态存储在会话中。如果您尝试提交表单,但会话已过期,则状态将丢失,因此会发生错误 但即使在这种情况下,也

有一种方法可以直接在jsf页面中检查是否存在活动会话? 我尝试过这个,但不起作用:

<p:ajaxStatus onerror="#{session == null ? 'idleDialog.show();' : null}"

在评估EL时,始终存在活动会话。如果在打开页面之前没有,则会自动创建该页面

在JSF中,由于所谓的“状态保存方法”,过期会话是一个问题。默认情况下,生成页面的状态存储在会话中。如果您尝试提交表单,但会话已过期,则状态将丢失,因此会发生错误


但即使在这种情况下,也会生成一个新会话。因此,正如BalusC所指出的,您可以让会话保持活动状态—使用ajax请求进行轮询(例如richfaces有这样的功能),这样会话就永远不会过期

您可以在JSF 2.0中使用以下EL表达式:

{facesContext.externalContext.getSession(false)=null}

请注意,引用隐式EL对象
会话
将自动(重新)再次创建它。因此,这一个永远不能用于测试

例如

假设您在一个支持bean中使会话无效,并且呈现了一个具有以下内容的Facelet:

#{facesContext.externalContext.getSession(false) == null}
#{session.new}
#{facesContext.externalContext.getSession(false) == null}
这将导致:

true true false

会话第一次真正消失,但通过引用隐式EL对象,它再次被创建(并将处于新状态)。然后,第二个测试发现会话再次出现。

是的,我知道,但我需要检查会话是否已过期,因此打开一个对话框以还原会话。如果会话已过期,您希望如何还原会话?您希望在用户在页面上处于活动状态时保持会话的活动状态,或者在会话过期时立即重定向到错误/登录页面。我可以创建一个新会话,只需在对话框中显示一个h:按钮,这样用户单击它,这将生成一个新会话@波佐:是的,使用ajax。在web.xml中,当您打开新页面或刷新当前页面时,不会自动生成新会话。因此,如果会话中没有存储任何感兴趣的内容,您可以简单地进行刷新。我最初的问题是如何在jsf页面中直接检查会话是否过期,可能使用#{session==null}或类似的方法,尽管技术上正确,这并不能满足OP最初的功能要求,即在页面仍在浏览器中打开时,只要会话已过期,就显示JS警报/对话框。您的答案假设客户端必须在会话过期后手动触发一个全新的同步HTTP请求(并且没有绑定到页面的会话/视图范围的托管bean)。然而,我必须承认,OP在这个问题上确实没有表达得足够清楚。是的,你是对的。我只关注标题问题“如何检查JSF页面中是否有活动会话?”。要实现OP在功能层面上的目标,需要更多的参与。我考虑的是异步Servlet3.0挂起的请求,当会话过期事件触发时,该请求将恢复。我自己还没有这方面的经验,所以我不愿意提供这个答案。相关问题:根据您的更新,您是否使用PrimeFaces发行候选版本而不是最终版本?2.2 RC1有一个bug:这是一个不同的故事。