Glassfish 访问位于另一台服务器中的远程ejb的简单方法

Glassfish 访问位于另一台服务器中的远程ejb的简单方法,glassfish,ejb,jndi,Glassfish,Ejb,Jndi,这是我关于堆栈溢出的第一个问题,所以我希望它不会太简单。我一直在互联网上寻找一个好的解决方案,但现在我还没有 一般来说,我是EJB、JNDI和JavaEE世界的乞丐,但在过去的几个月里,我已经能够在这个环境中做一些可以接受的事情。现在我正在关注工作中的一个问题,到目前为止,解决方案并没有我想要的那么好 场景是这样的:我有一个EAR应用程序运行在Glassfih 3.1.2中。我已经在这个EAR应用程序中声明了EJB,其中包含通过远程接口提供方法的无状态bean 例如,这是我在名为server1的

这是我关于堆栈溢出的第一个问题,所以我希望它不会太简单。我一直在互联网上寻找一个好的解决方案,但现在我还没有

一般来说,我是EJB、JNDI和JavaEE世界的乞丐,但在过去的几个月里,我已经能够在这个环境中做一些可以接受的事情。现在我正在关注工作中的一个问题,到目前为止,解决方案并没有我想要的那么好

场景是这样的:我有一个EAR应用程序运行在Glassfih 3.1.2中。我已经在这个EAR应用程序中声明了EJB,其中包含通过远程接口提供方法的无状态bean

例如,这是我在名为server1的服务器上运行的远程Bean

package com.booreg;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import com.booreg.IMyRemoteBean;

@Stateless
@LocalBean
public class MyRemoteBean implements IMyRemoteBean
{
    @Override
    public String helloWorld()
    {
        return "Hi what's up boy";
    }
}
这是它的接口

package com.booreg;

import javax.ejb.Remote;

@Remote
public interface IMyRemoteBean
{
    public String helloWorld();
}
然后我有了第二个EAR应用程序,必须在另一台名为server2的服务器上强制运行。第二个应用程序使用JSF和托管bean。我们有一个托管Bean作为MyRemoteBeanRemote的远程客户端,如下所示:

package com.nucleus;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.booreg.IMyRemoteBean;

@ManagedBean
@ViewScoped
public class MyManagedBean
{
    @EJB( name="TheRef") IMyRemoteBean myRemoteBean;

    public String getPhrase() { return myRemoteBean.helloWorld(); }
}
我已经到了这样的地步:在我的WEB项目中的WEB-INF/sun-WEB.xml文件中声明ejb引用是可行的

<ejb-ref>
    <ejb-ref-name>TheRef</ejb-ref-name>
    <jndi-name>corbaname:iiop:server1:3700#java:global/booreg/booreg.ejb/MyRemoteBean!com.booreg.IMyRemoteBean</jndi-name>
</ejb-ref>
但我仍然面临问题。部署应用程序时,服务器1出现下一个异常,我无法部署应用程序

ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable
org.omg.CORBA.BAD_PARAM: ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable  vmcid: SUN  minor code: 6 completed: Maybe
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
    at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
    at $Proxy117.notSerializable(Unknown Source)
    at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:783)
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:697)
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:545)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:493)
    ...
有人知道吗?

@dgisbert


在您提到的上一条评论中,一台服务器是公共服务器,另一台是企业的内部服务器。从公共服务器调用应用程序层并不是最好的做法。这意味着您可以直接访问您的关键业务层。我建议在EJB调用之上有一个Web服务层,这样来自公共站点的每个调用都必须通过WebServer->AppServer。通过这种方式,您可以大大降低攻击的风险

如果您自己通过jndi在代码中查找远程ejb,您可以使用服务器jvm变量作为端口和服务器。也许可以访问sun-web.xml中的jvm变量。我不知道这是否可能。我喜欢保持代码尽可能干净和简单。出于这个原因,我不喜欢在@EJB使工作更容易的代码中使用查找。您考虑过在集群中组织这两个实例吗?还没有。我有两个问题:1)我从来没有做过。2)两台服务器之间有防火墙,以阻止潜在危险的通信。其中一个服务器是公共internet站点。第二个是我们企业的内部服务器。我不确定此防火墙是否会导致创建群集时出现问题。如何查找
org.omg.CORBA.ORBInitialHost
?Server1必须在其DNS中注册Server2才能进行查找?谢谢您的回答,但我不认为最好使用中间Web服务层而不是远程EJB调用。通过远程EJB调用,我可以控制我的应用程序的哪些部分可以通过远程接口远程看到。@dgisbert—这与您公开的服务无关—而是让外部直接访问您的企业业务层。典型的体系结构建议是在外部和外部之间有一个DMZ层内部系统(ftp.software.ibm.com/software/rational/web/whitepapers/r_wp_securityrichwebapps.pdf)。。谷歌/必应在源代码处搜索保护企业、网络应用程序的安全。这是一份冗长的文档,但阅读它确实需要时间。黑客(Genius guys?)可能会利用此漏洞攻击您的层。他们会不断提供新方法再次感谢您的评论。我不是安全专家,但我担心安全问题。我已经下载了你提到的文件。很长,但我要看看。关于DMZ,我们已经在DMZ中安装了server1。因此,我们可以通过防火墙控制server1和server2之间的所有流量。我之所以称之为public,是因为我们允许在server1上进行web连接(当然,我们的页面是受密码保护的),而在server1和server2之间,我们只允许远程ejb调用。因此,在server1和server2之间有一个Web服务层与远程EJB服务层是一样的。
ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable
org.omg.CORBA.BAD_PARAM: ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable  vmcid: SUN  minor code: 6 completed: Maybe
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
    at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
    at $Proxy117.notSerializable(Unknown Source)
    at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:783)
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:697)
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:545)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:493)
    ...