我想從不同的EJB服務器調用遠程EJB。我在OpenEJB上部署了遠程EJB,然後我將從Glassfish HTTPServlet
中調用它們。我知道在本地EJB上,我可以執行@EJB批註,但我希望用戶從Glassfish servlet「認證」遠程OpenEJB服務器。來自HttpServlet的遠程EJB
上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身份驗證。 這真的讓我發瘋。什麼解決方案是好的,以逃避spagetti代碼?