【问题标题】:Building JCoServer without Properties-File在没有属性文件的情况下构建 JCoServer
【发布时间】:2011-04-01 01:54:55
【问题描述】:

我收到了另一个与 JCo 相关的问题,希望能得到帮助。

使用 JCo,您可以轻松地建立连接,就像 JCo 库附带的示例表中所解释的那样。不幸的是,建立连接的唯一方法是使用创建的属性文件来处理。如果其中没有任何明智的数据,它不会那么糟糕。但至少 SAP 用户的密码存在于文件中,因此这种连接处理方式缺乏安全性。 JCo 的手册也是这么说的:

“在本例中,目标配置存储在程序调用的文件中。实际上,出于安全原因,您应该避免这种情况。”

但毕竟找不到可行的解决方案。关于这个主题有很多话题,比如这样

http://forums.sdn.sap.com/thread.jspa?messageID=7303957

但它们都没有帮助。我真的想不出一个解决方案,也没有找到一个。实际上,我在建立连接后通过删除文件解决了安全问题,但这不是一个令人满意的解决方案。必须有更好的方法来获取连接参数,尤其是当它出现在手册中时,但我不知道如何使用。

有人已经使用过 JCo 3.0 并且知道这个问题吗?

【问题讨论】:

    标签: java properties connection sap jco


    【解决方案1】:

    是的,这是可能的。您必须创建自己的 DestinationDataProvider 实现并使用 Environment.registerDestinationDataProvider() 注册它。但是,您的 DDP 获取连接数据和凭据取决于您。看看net.sf.rcer.conn.connections.ConnectionManager,那里有一个工作示例。

    你需要

    • 复制从第 66 行开始的私有类,并根据您自己的需要进行调整(即,从您想要的任何地方获取连接数据)
    • 在应用程序启动期间的某处执行注册(第 204 行)
    • 使用将传递给 DestinationDataProvider 的字符串标识符获取连接。

    【讨论】:

    • 抱歉,我不太明白。包中有这么多依赖项,我不得不问,哪些类本质上是针对单个简单连接的所需功能?我已经浏览了这些课程,但我也不明白证书的目的。我想象它更容易。你的实现确实很棒,但我想建立自己的课程,到现在为止,我真的不知道如何:/
    • 我已经扩展了我的答案 - 这有帮助吗?
    • 是的,谢谢,它有帮助,但是如何替换 Connection 和 Credential-class?它们是完全必要的还是我可以自己实现它们的基本功能?直到现在我都无法理解这两个的全部功能:/
    • 感谢您的耐心等待 ;) 好的,我昨天已经解决了这个问题,所以我实现了自己的 DestinationDataProvider 与所需的数据采集。但是现在我被你的第三点抓住了如何传递字符串标识符。当我定义一个字符串,设置我的 Destinationproperties 并想用字符串调用目标时,属性如何与字符串链接。这对我来说是最有争议的部分,因为我总是只看到示例,其中此字符串仅指向具有相同名称的目标文件。
    【解决方案2】:

    这有点令人困惑,我也很难理解这一点。

    您只需要一个 java.util.Properties 类型的对象来填充所需的字段,但如何填充此对象取决于您。

    我通过 ValueObject 编辑它,我可以从文件、数据库、网络表单中填充这个 VO...

        JCOProvider jcoProvider = null;
        SAPVO sap = new SAPVO(); // Value Object
        Properties properties = new Properties();
    
        if(jcoProvider == null) {
    
    
            // Get SAP config from DB
            try {
                sap = SAPDAO.getSAPConfig(); // DAO object that gets conn data from DB
            } catch (Exception ex) {
                throw new ConexionSAPException(ex.getMessage());
            }
    
             // Create new conn
            jcoProvider = new JCOProvider();
    
        }
    
        properties.setProperty(DestinationDataProvider.JCO_ASHOST,        sap.getJCO_ASHOST());
        properties.setProperty(DestinationDataProvider.JCO_SYSNR,         sap.getJCO_SYSNR());
        properties.setProperty(DestinationDataProvider.JCO_CLIENT,        sap.getJCO_CLIENT());
        properties.setProperty(DestinationDataProvider.JCO_USER,          sap.getJCO_USER());
        properties.setProperty(DestinationDataProvider.JCO_PASSWD,        sap.getJCO_PASSWD());
        properties.setProperty(DestinationDataProvider.JCO_LANG,          sap.getJCO_LANG());
    //    properties.setProperty(DestinationDataProvider.JCO_TRACE,         "10");
    
        try {
    
            jcoProvider.changePropertiesForABAP_AS(properties);
    
        } catch (Exception e) {
    
            throw new ConexionSAPException(e.getMessage());
    
        }
    

    JCOProvider 类:

    import com.sap.conn.jco.ext.DestinationDataEventListener;
    import com.sap.conn.jco.ext.DestinationDataProvider;
    import com.sap.conn.jco.ext.Environment;
    import es.grupotec.ejb.util.ConexionSAPException;
    import java.util.Properties;
    
    public class JCOProvider implements DestinationDataProvider {
    
        private String SAP_SERVER = "SAPSERVER";
        private DestinationDataEventListener eventListener;
        private Properties ABAP_AS_properties;
    
        public JCOProvider() {
        }
    
        @Override
        public Properties getDestinationProperties(String name) {
    
            if (name.equals(SAP_SERVER) && ABAP_AS_properties != null) {
                return ABAP_AS_properties;
            } else {
                return null;
            }
    //        if(ABAP_AS_properties!=null) return ABAP_AS_properties;
    //        else throw new RuntimeException("Destination " + name + " is not available");
    
        }
    
        @Override
        public boolean supportsEvents() {
            return true;
        }
    
        @Override
        public void setDestinationDataEventListener(DestinationDataEventListener eventListener) {
            this.eventListener = eventListener;
        }
    
        public void changePropertiesForABAP_AS(Properties properties) throws ConexionSAPException {
    
            try {
    
                if (!Environment.isDestinationDataProviderRegistered()) {
    
                    if (ABAP_AS_properties == null) {
                        ABAP_AS_properties = properties;
                    }
                    Environment.registerDestinationDataProvider(this);
    
                }
    
                if (properties == null) {
    
                    if (eventListener != null) {
                        eventListener.deleted(SAP_SERVER);
                    }
                    ABAP_AS_properties = null;
    
                } else {
    
                    ABAP_AS_properties = properties;
                    if (eventListener != null) {
                        eventListener.updated(SAP_SERVER);
                    }
    
                }
    
            } catch (Exception ex) {
    
                throw new ConexionSAPException(ex.getMessage());
    
            }
    
    
        }
    }
    

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2015-09-22
      • 1970-01-01
      • 2021-07-29
      • 2021-01-27
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多