无法从其他主机进行远程 ejb 访问

Posted

技术标签:

【中文标题】无法从其他主机进行远程 ejb 访问【英文标题】:Unable to do a remote ejb access from a different host 【发布时间】:2011-12-02 20:05:14 【问题描述】:

我们正在使用 servlet 访问部署在不同主机上的远程 ejb 并获取 下面的堆栈跟踪中提到的异常。

    如果 servlet 客户端和远程 ejb 战争部署在不同域和同一主机上,则远程访问有效。

    如果它们部署在同一主机和同一域上,则可以工作

    在两个不同的主机上部署时不起作用。

    查看异常“CORBA.NO_PERMISSION: vmcid: 0x0 minor code: 0 completed: No”,我们认为这可能是安全问题。 但测试 ejb 应用程序没有任何安全配置。尝试将“”详细信息添加到 sun-ejb-jar.xml 并使用 ProgrammaticLogin api。我们得到了同样的例外。不过不确定安全配置是否正确。 glassfish-corba 日志级别在部署 ejb 应用程序的服务器中设置为最好。然后我们得到了这个例外,“ org.omg.CORBA.BAD_INV_ORDER:FINE:IOP01600015:便携式拦截器中的服务上下文添加失败,因为已经存在 id 为 15 的服务上下文 vmcid:SUN 次要代码:15 已完成:否”。 下面在服务器日志中提到了完整的堆栈跟踪。 尝试使用 Glassfish 错误中的前端后端测试用例:http://java.net/jira/browse/GLASSFISH-15523。我们是 得到同样的异常。

Glassfish 版本:3.1 build 43

不确定我们哪里出错了。请帮忙。谢谢。

客户端日志:

原因:javax.naming.NamingException: Exception resolve Ejb for 'Remote ejb-ref name=TestService,Remote 3.x interface =com.medallion.test.service.TestService,ejb-link=null,lookup=, mappedName=,jndi-name=corbaname:iiop:50.57.1​​50.62:3700#TestService,refType=Session' 。用于查找的实际(可能是内部的)远程 JNDI 名称是 'corbaname:iiop:50.57.1​​50.62:3700#TestService__3_x_Internal_RemoteBusinessHome__' [根异常是 org.omg.CORBA.BAD_PARAM: FINE: IOP00100009: string_to_object 转换由于模式特定部分错误而失败在名称 TestService__3_x_Internal_RemoteBusinessHome__ vmcid:SUN 次要代码:9 完成:否] 在 com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:178) 在 com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1106) 在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776) 在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 在 com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) ... 38 更多 原因:org.omg.CORBA.BAD_PARAM:FINE:IOP00100009:string_to_object 转换失败,原因是名称 TestService__3_x_Internal_RemoteBusinessHome__ vmcid:SUN 次要代码:9 已完成:否 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248) 在 com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access 400 美元(WrapperGenerator.java:107) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511) 在 com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99) 在 $Proxy142.soBadSchemaSpecific(未知来源) 在 com.sun.corba.ee.impl.resolver.INSURLOperationImpl.resolveCorbaname(INSURLOperationImpl.java:227) 在 com.sun.corba.ee.impl.resolver.INSURLOperationImpl.resolveINSURL(INSURLOperationImpl.java:154) 在 com.sun.corba.ee.impl.resolver.INSURLOperationImpl.operate(INSURLOperationImpl.java:145) 在 com.sun.corba.ee.impl.orb.ORBImpl.string_to_object(ORBImpl.java:976) 在 com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:171) ... 43 更多 引起:org.omg.CORBA.NO_PERMISSION: ----------BEGIN 服务器端堆栈跟踪---------- org.omg.CORBA.NO_PERMISSION:vmcid:0x0 次要代码:0 已完成:否 在 com.sun.enterprise.iiop.security.SecServerRequestInterceptor.handle_null_service_context(SecServerRequestInterceptor.java:421) 在 com.sun.enterprise.iiop.security.SecServerRequestInterceptor.receive_request(SecServerRequestInterceptor.java:443) 在 com.sun.corba.ee.impl.interceptors.InterceptorInvoker.invokeServerInterceptorIntermediatePoint(InterceptorInvoker.java:612) 在 com.sun.corba.ee.impl.interceptors.PIHandlerImpl.invokeServerPIIntermediatePoint(PIHandlerImpl.java:612) 在 com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.getServantWithPI(CorbaServerRequestDispatcherImpl.java:333) 在 com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:196) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) 在 com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) ----------END 服务器端堆栈跟踪---------- vmcid:0x0 次要代码:0 已完成:否 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 com.sun.corba.ee.impl.protocol.giopmsgheaders.MessageBase.getSystemException(MessageBase.java:900) 在 com.sun.corba.ee.impl.protocol.giopmsgheaders.ReplyMessage_1_2.getSystemException(ReplyMessage_1_2.java:131) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.getSystemExceptionReply(CorbaMessageMediatorImpl.java:637) 在 com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.processResponse(CorbaClientRequestDispatcherImpl.java:499) 在 com.sun.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.marshalingComplete(CorbaClientRequestDispatcherImpl.java:373) 在 com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:273) 在 com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:395) 在 org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112) 在 org.omg.CosNaming.NamingContextExtHelper.narrow(NamingContextExtHelper.java:73) 在 com.sun.corba.ee.impl.resolver.INSURLOperationImpl.resolveCorbaname(INSURLOperationImpl.java:212) ... 47 更多

服务器端日志(将 corba 日志级别设置为最好之后):

[#|2011-12-02T11:37:16.111-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba.org.glassfish.enterprise.iiop.impl|_ThreadID=161;_ThreadName=Thread- 2;ClassName=org.glassfish.enterprise.iiop.impl.IIOPSSLSocketFactory;MethodName=setAcceptedSocketOptions;|setAcceptedSocketOptions: SocketOrChannelAcceptorImpl[3700 IIOP_CLEAR_TEXT true true] ServerSocket[addr=/0:0:0:0:0:0:0:0 ,localport=3700] 套接字[addr=/173.13.42.205,port=54829,localport=3700]|#]

[#|2011-12-02T11:37:16.113-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba|_ThreadID=15;_ThreadName=Thread-2;ClassName=com.sun.logging。 LogDomains$1;MethodName=getResourceBundle;|找不到此记录器的资源包。失败的类名:org.glassfish.enterprise.iiop.impl.GlassFishORBManager|#]

[#|2011-12-02T11:37:16.180-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba|_ThreadID=161;_ThreadName=Thread-2;ClassName=com.sun.logging。 LogDomains$1;MethodName=getResourceBundle;|找不到此记录器的资源包。失败的类名:org.glassfish.enterprise.iiop.impl.GlassFishORBManager|#]

[#|2011-12-02T11:37:16.179-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba.org.glassfish.enterprise.iiop.impl|_ThreadID=161;_ThreadName=Thread- 2;ClassName=org.glassfish.enterprise.iiop.impl.POAProtocolMgr;MethodName=getEjbDescriptor;|POAProtocolMgr.getEjbDescriptor->: [B@77dc7838|#]

[#|2011-12-02T11:37:16.181-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba|_ThreadID=161;_ThreadName=Thread-2;ClassName=com.sun.logging。 LogDomains$1;MethodName=getResourceBundle;|找不到此记录器的资源包。失败的类名:org.glassfish.enterprise.iiop.impl.GlassFishORBManager|#]

[#|2011-12-02T11:37:16.181-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba.org.glassfish.enterprise.iiop.impl|_ThreadID=161;_ThreadName=Thread- 2;ClassName=org.glassfish.enterprise.iiop.impl.POAProtocolMgr;MethodName=getEjbDescriptor;|POAProtocolMgr.getEjbDescriptor: [B@77dc7838: ejbId: 4,294,967,297|#]

[#|2011-12-02T11:37:16.181-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba|_ThreadID=161;_ThreadName=Thread-2;ClassName=com.sun.logging。 LogDomains$1;MethodName=getResourceBundle;|找不到此记录器的资源包。失败的类名:org.glassfish.enterprise.iiop.impl.GlassFishORBManager|#]

[#|2011-12-02T11:37:16.181-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba.org.glassfish.enterprise.iiop.impl|_ThreadID=161;_ThreadName=Thread- 2;ClassName=org.glassfish.enterprise.iiop.impl.POAProtocolMgr;MethodName=getEjbDescriptor;|POAProtocolMgr.getEjbDescriptor

[#|2011-12-02T11:37:16.183-0600|FINE|glassfish3.1.1|javax.enterprise.resource.corba.OMG|_ThreadID=161;_ThreadName=Thread-2;ClassName=com.sun。 corba.ee.spi.orbutil.logex.WrapperGenerator;MethodName=handleFullLogging;|IOP01600015:在便携式拦截器中添加服务上下文失败,因为 id 为 15 的服务上下文已经存在 org.omg.CORBA.BAD_INV_ORDER:FINE:IOP01600015:便携式拦截器中的服务上下文添加失败,因为已经存在 id 为 15 的服务上下文 vmcid:SUN 次要代码:15 已完成:否 在 sun.reflect.GeneratedConstructorAccessor729.newInstance(未知来源) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248) 在 com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access 400 美元(WrapperGenerator.java:107) 在 com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511) 在 com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99) 在 $Proxy210.serviceContextAddFailed(未知来源) 在 com.sun.corba.ee.impl.interceptors.ServerRequestInfoImpl.enqueue(ServerRequestInfoImpl.java:702) 在 com.sun.corba.ee.impl.interceptors.ServerRequestInfoImpl.add_reply_service_context(ServerRequestInfoImpl.java:482) 在 com.sun.corba.ee.impl.interceptors.ServerRequestInfoImpl.setCurrentExecutionPoint(ServerRequestInfoImpl.java:738) 在 com.sun.corba.ee.impl.interceptors.PIHandlerImpl.invokeServerPIEndingPoint(PIHandlerImpl.java:632) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.runInterceptors(CorbaMessageMediatorImpl.java:2189) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.createResponseHelper(CorbaMessageMediatorImpl.java:2101) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.createResponseHelper(CorbaMessageMediatorImpl.java:2089) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.createSystemExceptionResponse(CorbaMessageMediatorImpl.java:2014) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:1796) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleThrowableDuringServerDispatch(CorbaMessageMediatorImpl.java:1758) 在 com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:255) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) 在 com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) 在 com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 在 com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) |#]

使用的代码:

客户:

小服务程序:

@WebServlet("/TestServlet") 公共类 TestServlet 扩展 HttpServlet

@EJB(name = "TestService")
private TestService testService;

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

    PrintWriter w = response.getWriter();

    try 
        w.write("Test o/p: " + testService.testEJB("This is a test msg") + "\n");

     catch (Exception e) 
        e.printStackTrace(w);
    


sun-web.xml:

<ejb-ref>
    <ejb-ref-name>TestService</ejb-ref-name>
    <!-- <jndi-name>corbaname:iiop:localhost:3700#TestService</jndi-name> -->
    <jndi-name>corbaname:iiop:<ip>:3700#TestService</jndi-name>
</ejb-ref>

远程ejb:

@Stateless(mappedName="TestService") 公共类 TestServiceImpl 实现 Serializable,TestService

private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(TestServiceImpl.class.getName());

@Resource EJBContext ejbContext;

@Override
public String testEJB(String testStr) 

    String userName = ejbContext.getCallerPrincipal().getName();

    System.out.println("Username: " + userName);

    return "Msg Recieved: " + testStr;


sun-ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
<enterprise-beans>
    <ejb>
        <ejb-name>TestServiceImpl</ejb-name>
        <jndi-name>TestService</jndi-name>
        <!--<ior-security-config>
            <as-context>
                <auth-method>USERNAME_PASSWORD</auth-method>
                <realm>database-realm</realm>
                <required>true</required>
            </as-context>
            <sas-context>
                <caller-propagation>supported</caller-propagation>
            </sas-context>
            <transport-config>
                <establish-trust-in-client>supported</establish-trust-in-client>
            </transport-config>
        </ior-security-config>-->
    </ejb>
</enterprise-beans>
<security-role-mapping>
</security-role-mapping>
  </sun-ejb-jar>

【问题讨论】:

【参考方案1】:

也许不是您问题的答案,但我会在这里提及:

我们在 glassfish 3.1.2 中遇到了类似的问题,其中发生的异常提到了CORBA.NO_PERMISSION,并且服务器端没有堆栈跟踪。在日志文件的某处,我们发现了异常Invalid iiop-listener orb-listener-1. Lazy-init not supported for SSL iiop-listeners

这是 glassfish 中的一个错误,请参阅:

https://java.net/jira/browse/GLASSFISH_CORBA-13

glassfish 管理界面会自动将 SSL 条目添加到配置的非 SSL iiop-listener,因此,会发生异常并且远程处理将不再起作用。作为解决方法,您可以手动从domain.xml 中删除 SSL-config-entry 以再次进行远程处理。但是一旦您在管理界面中再次打开 IOP-Listener 部分,该条目将在 glassfish 重新启动时再次创建。

【讨论】:

以上是关于无法从其他主机进行远程 ejb 访问的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 远程 EJB 调用

在其他模块的 JSF ManagedBean 中通过 @EJB(lookup) 注入远程无状态 EJB

无法在 JBoss 的上下文中从客户端应用程序获取远程 ejb

从主机 Windows 上无法远程访问 Linux 的 Tomcat 服务器解决方法

使用XP客户端访问远程桌面WEB主机时,提示“此RDP文件已损坏 远程连接无法启动”原因及如何解决?

从 Tomcat Web 应用程序调用的 Weblogic 上部署的远程 Ejb bean