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

mayingbao 阅读:115 2025-02-15 21:57:57 评论:0

我正在使用 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 之间使用/共享。


标签:Servlet
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号