gpt4 book ai didi

java - 来自 HttpServlet 的远程 EJB

转载 作者:行者123 更新时间:2023-12-01 04:39:18 25 4
gpt4 key购买 nike

我想从不同的 EJB 服务器调用远程 EJB。我已经在 OpenEJB 上部署了远程 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 进行身份验证。这真让我生气。什么解决方案可以很好地摆脱意大利面条代码?

最佳答案

两个想法:

  1. 当用户登录 Glassfish 时向 OpenEJB 进行身份验证,将 EJB stub 存储在用户 session 中并在以后重用。我担心您需要为 serialization of the stub 实现一些 EJB 2.x 接口(interface)。 (所谓的句柄)来工作。

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

关于java - 来自 HttpServlet 的远程 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com