如何检查JSF页面中是否存在活动会话?

时间:2011-01-16 14:58:17

标签: java session jsf session-timeout

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

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

提前谢谢

@Update 我已经看到即使出现viewExpiredException也不会触发onerror。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

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

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

E.g。

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

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

这将呈现:

true true false

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