jsf - 在 CDI bean 的非请求环境中获取 JSF ServletContext

标签 jsf cookies initialization cdi

我正在使用 TomEE+ 1.7.1。 使用 JSF 托管 bean,此代码运行良好:

@ManagedBean( eager = true )
@ApplicationScoped
public class AppBean {

    @PostConstruct
    public void init() {
        ServletContext sc = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        if (GlobalSettings.TESTMODE) {
            sc.getSessionCookieConfig().setDomain("." + GlobalSettings.APP_DOMAIN_TEST);
        } else {
            sc.getSessionCookieConfig().setDomain("." + GlobalSettings.APP_DOMAIN);
        }
    }
}

init 函数在应用程序启动时运行并且 ServletContext 可用。

我到处都读到是时候迁移到 CDI bean 而不是 JSF bean 了。所以我想将 @ManagedBean( eager = true ) 更改为 @Named @Eager(@Eager 来自 Omnifaces)。 Init 函数在应用程序启动时运行,但没有 FacesContext,所以我无法获取 ServletContext。

一般问题:如何在CDI bean中获取非请求环境下的ServletContext? (ServletContext 不是“每个请求”对象,因此它应该在第一个请求之前存在。)

具体问题:如何在第一个请求发生之前从代码动态设置 session cookie 的域?

最佳答案

你应该使用 ServletContextListener为了在基于 servlet 的应用程序上执行编程配置。

@WebListener
public class Config implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        ServletContext servletContext = event.getServletContext(); 
        // ...
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        ServletContext servletContext = event.getServletContext(); 
        // ...
    }

}

@WebListener 本质上也是 CDI 管理的,因此您可以只使用 @Inject 和那里的 friend 。

应用程序范围内的托管 bean 旨在保存应用程序范围内的数据/状态,这些数据/状态可以在请求/ View / session 之间使用/共享。

关于jsf - 在 CDI bean 的非请求环境中获取 JSF ServletContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29535046/

相关文章:

java - 如何在使用 PDPageContentStream/PDDocument 时处理 Java 中的非 ASCII 字符

ajax - 如何以编程方式对Backing bean中的Ajax更新特定组件

cookies - 如何在 Angular 2 中设置 cookie 的到期日期?

javascript - 为什么这些cookie代码在asp.net mvc中不起作用?

jsf - 托管 bean 中的 View 和 Request 范围之间的区别

java - 如何检查 xhtml 属性中的日历值是否为 null 或为空

java - 不使用 cookie 访问 URL 参数

javascript - 使用默认内容初始化tinyMCE

objective-c - 使用字典值动态填充对象属性

c - 将字符串文字与数组分配给 char