【问题标题】:How to check if there is an active session in a JSF page?如何检查 JSF 页面中是否存在活动会话?
【发布时间】:2011-06-10 00:19:00
【问题描述】:

有没有办法直接在 jsf 页面中检查是否有活动会话? 我试过这个,但它不起作用:

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

提前谢谢你

@Update 我看到即使发生 viewExpiredException 也不会触发 onerror 。

【问题讨论】:

标签: java session jsf session-timeout


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我知道,但我需要检查会话是否已过期,然后打开一个对话框以恢复会话。
  • 如果会话过期,您希望如何恢复会话?只要用户在页面上处于活动状态,您就希望保持会话处于活动状态,或者在会话到期时立即重定向到错误/登录页面。
  • 我可以创建一个新会话,只需在对话框中显示一个 h:button,因此用户单击它会生成一个新会话。 @Bozho 是的,使用 ajax。 web.xml 中的 无法正常工作
  • 打开新页面或刷新当前页面时会自动生成一个新会话。因此,如果会话中没有存储任何感兴趣的内容,您可以简单地刷新。
  • 我最初的问题是如何在 jsf 页面中直接检查会话是否过期,可能使用 #{session == null} 或类似的东西
【解决方案2】:

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

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

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

例如

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

#{facesContext.externalContext.getSession(false) == null}
#{session.new}
#{facesContext.externalContext.getSession(false) == null}

这将呈现:

true true false

会话首先真的消失了,但是通过引用隐式 EL 对象,它再次被创建(并且将处于新状态)。然后第二个测试发现会话再次存在。

【讨论】:

  • 虽然在技术上是正确的,但这并不能满足 OP 的初始功能要求,即每当会话过期而页面仍在浏览器中打开时显示 JS 警报/对话框。您的答案假定客户端必须在会话过期后手动触发一个全新的同步 HTTP 请求(并且没有会话/视图范围的托管 bean 绑定到页面)。但是,我必须承认,OP 在问题中确实没有足够清楚地表达这一点。
  • 是的,你是对的。我只关注标题问题“如何检查 JSF 页面中是否存在活动会话?”。要在功能级别上实现 OP 想要的,需要更多的参与。我正在考虑异步 Servlet 3.0 暂停请求,当会话过期事件触发时,该请求会恢复。我自己还没有这方面的经验,所以我不放心提供这个作为答案。
猜你喜欢
  • 2011-12-29
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2014-01-14
  • 2012-10-18
相关资源
最近更新 更多