プロパティファイルのないJcoserverの構築
-
29-09-2019 - |
質問
私は別のJCO関連の質問を受け取り、うまくいけば助けを見つけました。
JCOを使用すると、JCO-Libraryに付属しているサンプルシートで説明されているように、接続を簡単に構築できます。残念ながら、接続を構築する唯一の方法は、作成されたプロパティファイルで処理されます。賢明なデータがなければ、それほど悪くないでしょう。しかし、少なくとも、SAPユーザーのパスワードはファイルにあるため、この接続処理方法では安全性が不足しています。 JCOのマニュアルもそう言っています:
「この例では、宛先構成はプログラムによって呼び出されるファイルに保存されます。実際には、セキュリティ上の理由からこれを避ける必要があります。」
しかし、結局のところ、実用的な解決策を見つけることができませんでした。このようなこのテーマについては、このテーマには手のひらのスレッドがあります
http://forums.sdn.sap.com/thread.jspa?messageid=7303957
しかし、それらのどれも役に立ちません。私は本当に解決策を理解することができず、どちらも見つけられません。実際、接続を構築した後にファイルを削除することでセキュリティの問題を解決しましたが、これは満足のいくソリューションではありません。特にマニュアルにある場合は、接続のパラメーターをより良い方法を取得する必要がありますが、接着剤はありません。
誰かがすでにJCO 3.0で働いていて、この問題を知っていますか?
解決
はい、それは可能です。 DestinationDataproviderの独自の実装を作成し、環境を使用して登録する必要があります。RegisterDestinationDataProvider()。ただし、DDPは接続データを取得し、資格情報はあなた次第です。を見てみましょう net.sf.rcer.conn.connections.connectionmanager, 、そこには実用的な例があります。
必要がある
- 66行目で開始するプライベートクラスをコピーして、自分のニーズに合わせて適応します(つまり、どこにいても接続データを取得します)
- アプリケーションのスタートアップ中にどこかで登録(204行目)を実行します
- 宛先DataProviderに渡される文字列識別子を使用して接続を取得します。
他のヒント
それは少し混乱しています、それは私にとってもこれを理解する方法でした。
必要なのは、目的のフィールドを埋めるためのタイプjava.util.propertiesのオブジェクトだけですが、このオブジェクトを埋める方法があります。
ValueObjectを介してそれをディットし、ファイル、データベース、Webフォームからこの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());
}
}
}
よろしく