JSF - 如何在会话超时时保存managedBean状态?

时间:2012-01-11 15:14:18

标签: session jsf session-timeout

我正在为一个客户端工作,该客户端在空闲超时的情况下拥有自己的会话管理系统。会发生以下情况:

  1. 用户在设定的时间内保持空闲状态。
  2. 会话超时重定向到登录页面
  3. 用户输入凭据并重定向回原来的位置。
  4. 现在通过将 javax.faces.ViewState 传递给会话管理系统的POST请求来处理上述过程。但是,如果超时,请求中只需要8K的数据来处理和重定向。但是由于我的托管bean节省了大量数据(银行应用程序,需要跟踪计算!),请求的大小很高(大约20K),因为重定向失败。

    那么有什么方法可以以某种方式保存ViewState?或者更好,我可以阻止超时的任何方式?像保持会话活着的东西?

    我所有的托管bean都有session范围。

    编辑:如果需要,为了提高性能,web.xml中的javax.faces.STATE_SAVING_METHOD context-param设置为client

    编辑:使用HttpWatch对流进行了跟踪,发现 javax.faces.ViewState 占据了POST请求总大小为22kB的18kB。所以我的目标是缩小到缩小ViewState的大小。我有什么方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

状态保存仅保留与当前视图关联的数据。这里的问题是会话作用域bean丢失了。我建议两种解决问题的方法:

1)实现HttpSessionListener并在其sessionDestroyed()方法中获取bean,将它们序列化并将它们存储在与当前用户关联的数据库行中。当用户再次登录时,您可以获取bean,反序列化它们并将它们放入用户的会话中。

2)实现ajax轮询,该轮询将在特定时间段内ping服务器,这样会话将不会超时。您可以使用Richfaces JSF库来实现这一点,该库具有用于ajax轮询的内置JSF组件。