0

应用程序默认会话超时设置为 30 分钟,我需要保留一些 bean 数据超过 2 小时,JSF 中有什么方法可以实现这个场景吗?(比如定义自定义范围 bean 和设置生命周期最多2小时)。

提前致谢。

4

2 回答 2

1

不,通常不可能阻止容器在不再需要 JSF bean 时销毁它。

因此,您可以使用 ApplicationScoped bean 或 Singleton EJB。

另一种解决方案是使用 SessionScoped bean 并设置不同的会话超时,但是在用户通过注销或关闭浏览器使会话无效后,您将丢失数据。

另一种解决方案是将数据保存到数据库中,但我假设您已经考虑过了。

链接

于 2013-10-09T06:24:41.953 回答
0

除了应用程序范围的 bean 之外,上面的每个范围@RequestScoped都必须存储在 Session 中,因为没有其他地方可以存储 JSF 的数据。自定义范围无法改变这一点。

因此,当您的 Session 在 30 分钟后被销毁时,一切都将丢失。最好的解决方案是通过在 web.xml 中设置会话超时(以分钟为单位)来将其设置为更高的值:

<web-app ...>
<session-config>
    <session-timeout>120</session-timeout>
</session-config>
</web-app>

或以编程方式(以秒为单位):

HttpSession session = request.getSession();
session.setMaxInactiveInterval(120*60);

如果您@SessionScoped只为那些需要 2 小时可用的 bean 进行设置,并使用@RequestScopedor@ViewScoped用于其他所有内容,那么您的 Session 将只保留您想要保留 2 小时的数据,而其他所有内容都将更早地被删除。

于 2013-10-10T04:50:35.873 回答