当前位置: 首页 > 知识库问答 >
问题:

删除会话超时时的JSF托管bean

袁奇逸
2023-03-14

我在解决如何正确处理JSF中会话的自动销毁方面遇到了困难。当然,此时,容器会使会话失效,从而也会在会话范围的bean上调用@PreDestroy方法。

在某些会话范围bean的预销毁中,我们正在注销一些侦听器,如下所示:

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

然而,getWS()方法实际上试图获取对另一个会话范围bean的引用,但失败了,如FacesContext。getCurrentInstance()返回null。Ryan Lubke认为,后者似乎是正常的JSF行为:

我们遵守这里的规范。我不确定是否可以安全地假设FacesContext在所有@PreDestroy案例中都可用。考虑会话作用域bean。由于不活动,容器可能会超时会话。此时无法使用FacesContext。

我没问题,但如何确保正确清除所有对象呢?在动情前期把自己作为倾听者去掉是不是一种不好的做法?或者我们只需要对请求/视图范围的bean执行此操作,因为它们比WS的会话范围(从getWS())活得短?

请注意,我在Tomcat7上得到了这种行为,但我希望这个问题发生在每个容器上。

共有1个答案

颛孙智勇
2023-03-14

我认为会话bean是在servlet容器上的专用线程中清理的,因此在FacesContext(与JSF请求关联)之外。您可以使用HttpSessionListener来解决问题并清理会话资源。比如:

@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");
}
}

希望这能对你有所帮助

 类似资料:
  • 是否有可能“拦截”会话超时? 我尝试了,但据我所知,当调用HttpSessionListener.session毁灭()'方法时,会话已经被摧毁。(所以我没有机会确定用户,拥有超时的会话) 另一个选项是PhaseListener,在restoreView阶段检查会话是否是“新的”。 但是,我需要在会话超时的“第二天”执行一些操作-不在以后的刷新中执行,也不在以后的登录中执行。 (背景:需要删除某些

  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 问题内容: 有什么方法可以使用Angularjs管理用户会话吗? 会话超时-系统空闲时。 在会话即将到期时发出警报,并带有恢复会话的选项。 如果会话已过期,则在尝试发出请求时重定向(或其他任何操作)。 拦截器可以解决这个问题吗?你能举个例子吗? 提前致谢。 问题答案: 尝试ng-idle。它是一个简单的组件,您可以在其中设置超时和警告时间,直到达到超时。然后,您可以查询服务器上的用户注销或类似内容

  • 在 HTTP 协议中,当客户端不再处于活动状态时没有显示的终止信号。这意味着当客户端不再处于活跃状态时可以使用的唯一机制是超时时间。 Servlet 容器定义了默认的会话超时时间,且可以通过 HttpSession 接口的 getMaxInactiveInterval 方法获取。开发人员可以使用HttpSession 接口的 setMaxInactiveInterval 方法改变超时时间。这些方法

  • 我有一个会话范围的CDI托管bean: 在某个流之后,我需要从会话中删除这个bean,对于该流,我使用了以下代码,如下面的答案所示: 但是,它不起作用,仍然留在会话中。 我是否遗漏了什么?

  • 问题内容: 我在用户登录时创建会话,如下所示: 如何在X分钟的会话上指定超时,然后在达到X分钟后让它执行功能或页面重定向? 编辑:我忘了提及由于不活动,我需要会话超时。 问题答案: 首先,存储用户最后一次发出请求的时间 在后续请求中,检查他们多久之前提出了请求(在此示例中为10分钟)