如何使用拦截器在 CORBA 中操作发送到远程对象的参数

Posted

技术标签:

【中文标题】如何使用拦截器在 CORBA 中操作发送到远程对象的参数【英文标题】:How to manipulate parameters sending to remote object in CORBA using interceptors 【发布时间】:2019-03-19 09:56:16 【问题描述】:

CORBA 新手,但可以建立从客户端到服务器的远程方法调用。使用拦截器并尝试加密远程方法的参数时,它会抛出以下错误

Failed to initialise ORB: org.omg.CORBA.NO_RESOURCES:   vmcid: OMG  minor code: 1  completed: No org.omg.CORBA.NO_RESOURCES:   vmcid: OMG  minor code: 1completed: No at com.sun.corba.se.impl.logging.OMGSystemException.piOperationNotSupported1(Unknown Source)
at com.sun.corba.se.impl.logging.OMGSystemException.piOperationNotSupported1(Unknown Source)
at com.sun.corba.se.impl.interceptors.ClientRequestInfoImpl.arguments(Unknown Source)
at orb.CustomClientInterceptor.send_request(CustomClientInterceptor.java:23)

我正在尝试从拦截器访问参数并像下面这样加密它们。

public void send_request( ClientRequestInfo ri )

    System.out.println( ri.arguments() );
    System.out.println( "Arguments.." );
    logger( ri, "send_request" );

但甚至无法访问它们,它会引发上述错误。拦截方法调用正常。你能指导我一些代码或链接吗?

提前致谢

【问题讨论】:

这不是rmi,这是直接CORBA编程。遗憾的是,J2SE 并不支持所有的拦截。 CORBA 有拦截器?? @Antoniossss 当然,服务器端和客户端。见org.omg.PortableInterceptor。 @Antoniossss 检查代码如果你想有一个拦截器,然后操作远程对象的参数。 @user207421,我发现只有 DII 和 DSI 调用被允许访问和操作远程对象的参数。看看我的回答 【参考方案1】:

我找到了答案,如果将来有人遇到这个问题..

除非对 CORBA 对象的调用是 DII 或 DSI 调用,否则我们不能在拦截器中操作参数。所以首先你需要在其中任何一个中拨打电话。我是通过 DII 做到的。代码如下。

                //-ORBInitialPort 1050 -ORBInitialHost localhost
                Properties p = new Properties();
                p.put("org.omg.PortableInterceptor.ORBInitializerClass.orb.InterceptorORBInitializer", "");
                //ORB orb = ORB.init(args, p);

                String[] orbArgs =  "-ORBInitialHost", "localhost", "-ORBInitialPort", "1050" ;
                //NO_NEED ORB orb = ORB.init( orbArgs, null );
                orb = ORB.init(orbArgs, p);
                //objRef = orb.resolve_initial_references( "NameService" );
                //ncRef = NamingContextExtHelper.narrow( objRef );

                //DII Additional configs
                org.omg.CORBA.Object ncRef = orb.resolve_initial_references ("NameService"); 
                NamingContext nc = NamingContextHelper.narrow (ncRef); 
                NameComponent nComp = new NameComponent ("ABC", ""); 
                NameComponent [] path = nComp; 
                objRef = nc.resolve (path); 

然后进行 DII 调用,我这里有一些混合代码,但你会明白该怎么做

        NVList argList = orb.create_list (valueMap.size()); 
        for (Map.Entry<String, String> entry : valueMap.entrySet()) 
            Any argument = orb.create_any (); 
            argument.insert_string (entry.getValue()); 
            argList.add_value (entry.getKey().toLowerCase(), argument, org.omg.CORBA.ARG_IN.value); 
        


        //Result
        Any result = orb.create_any (); 
        result.insert_string( null ); 
        NamedValue resultVal = orb.create_named_value ("result", result, org.omg.CORBA.ARG_OUT.value); 

        //Invoking Method
        Request thisReq = objRef._create_request (null, methodName, argList, resultVal); 
        thisReq.invoke (); 

        //Extract Result
        result = thisReq.result().value (); 

现在,您只需从拦截器中过滤 DII 调用,然后访问如下参数。

public void send_request( ClientRequestInfo ri )

    if(ri.operation().equals( "processPayment" ))
    
        System.out.println( "################# CLIENT SIDE ###############" );
        int count = 0;
        for(Parameter param : ri.arguments())
        
            System.out.println( "Arg : "+count );
            System.out.println( param.argument.extract_string());
            param.argument.insert_string( EncryptionDecryption.encrypt( param.argument.extract_string() ) );
            count++;
        
    
    System.out.println( "Arguments.." );
    logger( ri, "send_request" );

【讨论】:

非常好,干得好,我在几年前曾与此作斗争,但没有发现。

以上是关于如何使用拦截器在 CORBA 中操作发送到远程对象的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器获取我的 Corba 客户端的 IP 地址

CORBA 架构体系指南(通用对象请求代理体系架构)

CORBA 架构体系指南(通用对象请求代理体系架构)

Corba IOR 解码

如何在非对称系统中将对象发送到远程 akka 演员

在 Nuxt.js 中发送每个请求时,如何将对象添加到 apollo 上的数据?