【问题标题】:Recover environment properties sent to EJB恢复发送到 EJB 的环境属性
【发布时间】:2025-11-25 17:55:01
【问题描述】:

我有一个委托,它通过 InitialContext as shown here 实例化相应的 Bean 发送凭据(Josso 身份验证)。

在Bean,我尝试过用SessionContext恢复Josso Data,如下图:

@Resource private SessionContext context;

我面临的问题是我无法在 Bean 范围内检索 Josso 数据。我已经尝试过“context.getEnvironment()”,但这种方法已被弃用,我没有找到任何替代方法。

为了找到解决办法,我试过了:

context.lookup(JNDI_BEAN_NAME);
context.lookup("java:comp/env/JNDI_BEAN_NAME")
context.lookup("java:comp/env")

但是前两个命令只返回 Bean 本身,最后一个只返回全局变量。

“context.getEnvironment()”的正确替代方法是什么?

【问题讨论】:

  • 您认为context.getEnvironment() 过去会返回什么?它是一个 EJB 1.0 API,在 EJB 1.1 中已被弃用。它已替换为 ejb-jar.xml 部署描述符中的 <env-entry> 元素
  • 您将无法恢复“凭据”,但是您可以通过注入安全主体:@Resource java.security.Principal principal 或通过 SessionContext.getCallerPrincipal() 来获取经过身份验证的用户身份。
  • 我的 EJB 配置不包括 ejb-jar.xml。关于您的建议,我也可以通过 SessionContext 恢复密码或 jossoId 吗?我需要这个有一个经过身份验证的 bean
  • 我有一个过滤器,当时我拥有所有这些信息(用户、密码、jossoid),并且我在会话中添加了这些属性。我的 Bean 上至少需要 JossoId。有什么建议吗?
  • 如果您已将 Josso 与您的应用程序服务器正确集成,安全上下文将从您的 Web 应用程序传播到您的 EJB 和其他托管 bean。

标签: java ejb cdi initial-context josso


【解决方案1】:

java:comp/env 仅查找容器管理的资源并且在运行时是只读的。如果您愿意,您可以公开一个从代理获取 Josso 凭据的本地接口。

@Local
public interface AuthenticatorLocal {
    void getJossoCredentials();
}

否则,您可以使用context.getCallerPrincipal()

【讨论】:

  • 您的想法引导我找到替代解决方案,感谢分享。事实上,我拥有我需要的所有数据,而我们的一门课程为我提供了 Josso Data。