gpt4 book ai didi

jsf - 在 session 超时时删除 JSF 托管 bean

转载 作者:行者123 更新时间:2023-12-02 03:25:59 24 4
gpt4 key购买 nike

我无法弄清楚如何正确处理 JSF 中 session 的自动销毁。当然,此时 session 会被​​容器失效,从而导致在 session 作用域的 bean 上调用 @PreDestroy 方法。

在某些 session 作用域 bean 的 PreDestroy 中,我们正在注销一些监听器,如下所示:

@PreDestroy
public void destroy() {
getWS().removeLanguageChangeListener(this);
}

但是,getWS() 方法实际上试图获取对另一个 session 作用域 bean 的引用,但是失败了,因为 FacesContext.getCurrentInstance() 返回 null。根据 Ryan Lubke 的说法,后者似乎是正常的 JSF 行为:

We're true to the specification here. I'm not sure it's safe to assume that the FacesContext will be available in all @PreDestroy cases. Consider session scoped beans. The session could be timed out by the container due to inactivity. The FacesContext cannot be available at that time.

对我来说很好,但是应该如何确保正确清除所有对象?在 PreDestroy 中将自己作为监听器删除是不好的做法吗?或者我们只需要为请求/ View 范围的 bean 执行此操作,因为它们的生命周期比 WS 的 session 范围短(来自 getWS() )?

请注意,我在 Tomcat7 上遇到了此行为,但我预计此问题会发生在每个容器上。

最佳答案

我认为 session bean 在 servlet 容器上的专用线程中被清理,因此在 FacesContext 之外(与 JSF 请求相关联)。您可以使用 HttpSessionListener 来解决问题并清理 session 资源。像这样的东西:

@WebListener
public class LifetimeHttpSessionListener implements HttpSessionListener {

@Override
public void sessionCreated(final HttpSessionEvent e) {
// create some instance here and save it in HttpSession map
HttpSession session = e.getSession();
session.setAttribute("some_key", someInstance);
// or elsewhere in JSF context:
// FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("some_key", someInstance);
}

@Override
public void sessionDestroyed(final HttpSessionEvent e) {
// get resources and cleanup them here
HttpSession session = e.getSession();
Object someInstance = session.getAttribute("some_key");
}
}

希望对你有所帮助

关于jsf - 在 session 超时时删除 JSF 托管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30298906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com