1

我想从不同的 EJB 服务器调用远程 EJB。我已经在 OpenEJB 上部署了 Remote EJB,然后我将从 Glassfish 调用它们HTTPServlet。我知道在本地 EJB 上我可以做 @EJB 注释,但我希望用户从 Glassfish servlet“验证”远程 OpenEJB 服务器。

在 OpenEJB 上:

//OpenEJB server at 192.168.10.12
public class AdminManager {
    @RolesAllowed("admin")
    public void test() {
        System.out.println("Admin called this method");
    }
}

Glassfish Servlet

//Glassfish servlet at 192.168.10.10
public class AdminManage extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Properties p = new Properties();
            p.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
            p.put("java.naming.provider.url", "ejbd://192.168.10.12:4201");
            // user and pass optional

      String userName = req.getSession().getAttribute("username");
      String password = req.getSession().getAttribute("password");
            p.put("java.naming.security.principal", userName );
            p.put("java.naming.security.credentials", "password );

            final InitialContext ctx = new InitialContext(p);

            final AdminManagerRemote myBean = (MyBean) ctx.lookup("AdminManagerRemote");
            try {
                myBean.test();
            } catch(Exception epx) {
                resp.sendRedirect(resp.encodeRedirectURL("/login"));
            }
    }
}

好的,这似乎是一个解决方案,但这对我来说不是“好”的解决方案。每次对 openejb 进行身份验证都很糟糕,就像这样;

  String userName = req.getSession().getAttribute("username");
  String password = req.getSession().getAttribute("password");
  p.put("java.naming.security.principal", userName );
  p.put("java.naming.security.credentials", "password );

而且代码不干净。我希望用户只进行一次身份验证并调用 ejb 方法。那么有没有更好的解决方案呢?

我可以将 Glassfish HTTP 身份验证与远程 openEJB 身份验证结合使用吗?我的意思是当用户向 Glassfish HTTP 服务器进行身份验证时,我也希望 openEJB 进行身份验证。这真的让我很生气。什么解决方案可以从意大利面条代码中逃脱?

4

3 回答 3

0

两个想法:

  1. 当用户登录到 Glassfish 时向 OpenEJB 进行身份验证,将 EJB 存根存储在用户会话中并在以后重用它。我担心您需要实现一些 EJB 2.x 接口才能使存根(所谓的句柄)的序列化工作。

  2. 实现一个缓存来存储 EJB 存根。如果给定用户名/密码的存根在缓存中,则重用它,如果没有,则进行身份验证。缓存是一个静态对象,例如可以使用 Guava 的CacheBuilder创建它。这违反了规范(您不应该使用 static 在 servlet 之间共享信息),但由于它是一个缓存,所以没什么大不了的。它甚至可以在集群中工作。

于 2013-06-03T06:28:33.097 回答
0

您可以尝试引入服务定位器模式来消除代码中的冗余并隐藏底层细节和创建初始上下文、JNDI 查找等的复杂性。

您可以缓存远程主界面EJBHome,然后在需要时重新使用它。

可以参考核心 J2EE 模式 - 服务定位器文档以获取更多详细信息。

于 2013-06-03T09:02:45.210 回答
0

Kerberos 呢?有人知道kerberos解决方案吗?使用 TGS 登录到所有远程服务器。

但是互联网上没有这样的样本。并且很难用 openldap 安装 kerberos。

于 2013-06-12T06:16:50.120 回答