我想从不同的 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 进行身份验证。这真的让我很生气。什么解决方案可以从意大利面条代码中逃脱?