应用程序默认会话超时设置为 30 分钟,我需要保留一些 bean 数据超过 2 小时,JSF 中有什么方法可以实现这个场景吗?(比如定义自定义范围 bean 和设置生命周期最多2小时)。
提前致谢。
应用程序默认会话超时设置为 30 分钟,我需要保留一些 bean 数据超过 2 小时,JSF 中有什么方法可以实现这个场景吗?(比如定义自定义范围 bean 和设置生命周期最多2小时)。
提前致谢。
不,通常不可能阻止容器在不再需要 JSF bean 时销毁它。
因此,您可以使用 ApplicationScoped bean 或 Singleton EJB。
另一种解决方案是使用 SessionScoped bean 并设置不同的会话超时,但是在用户通过注销或关闭浏览器使会话无效后,您将丢失数据。
另一种解决方案是将数据保存到数据库中,但我假设您已经考虑过了。
链接:
除了应用程序范围的 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 进行设置,并使用@RequestScoped
or@ViewScoped
用于其他所有内容,那么您的 Session 将只保留您想要保留 2 小时的数据,而其他所有内容都将更早地被删除。