Question

Je suis une autre question liée JCo et trouver, espérons-aide.

Avec JCo, vous pouvez facilement construire une connexion comme il est expliqué dans les exemples de feuilles qui sont entrées avec la JCo bibliothèque. Malheureusement, la seule façon la construction d'une connexion est gérée avec un fichier de propriétés créé. Il ne voudrais pas être si mal que ça, s'il n'étais pas des données sensibles en elle. Mais au moins, le mot de passe pour l'utilisateur SAP se trouve dans le fichier, il est donc un manque de sécurité dans ce mode de manutention de connexion. Le manuel de JCo le dit aussi:

« Dans cet exemple, la configuration de destination est stockée dans un fichier qui est appelé par le programme. Dans la pratique, vous devez éviter cela pour des raisons de sécurité ».

mais trouver une solution couldnt travail après tout. Il y a des fils palmful sur ce thème, comme celui-ci

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

mais aucun d'entre eux sont utiles. Je figure vraiment -CAN'T une solution et ne trouver un. En fait, je résolu le problème de sécurité avec la suppression du fichier après la construction de la connexion, mais ce n'est pas une solution satisfaisante. Il doit y avoir une meilleure façon d'obtenir le paramètre pour la connexion, surtout quand il se trouve dans le manuel, mais je ne colle comment.

Tout le monde a déjà travaillé avec JCo 3.0 et connaît ce problème?

Était-ce utile?

La solution

Oui, cela est possible. Vous devez créer votre propre implémentation de DestinationDataProvider et l'enregistrer en utilisant Environment.registerDestinationDataProvider (). Toutefois, votre DDP obtient les données de connexion et les informations d'identification est à vous. Jetez un oeil à net.sf.rcer.conn.connections.ConnectionManager , il y a un exemple de travail là-bas.

Vous devez

  • copie la classe privée à partir de la ligne 66 et l'adapter à vos propres besoins (qui est, récupérer les données de connexion de partout où vous voulez)
  • effectuer l'enregistrement (ligne 204) quelque part lors du démarrage de votre application
  • obtenir la connexion en utilisant un certain identificateur de chaîne qui sera transmis à votre DestinationDataProvider.

Autres conseils

Il est un peu confus, il m'a été dificile comment comprendre aussi.

Tout ce que vous avez besoin est un objet de type java.util.Properties pour remplir les champs souhaités, mais il est à comment remplir ous cet objet.

Je dit à travers un ValueObject, je peux remplir ce VO à partir d'un fichier, base de données, formulaire web ...

    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());

    }

La classe 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());

        }


    }
}

Cordialement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top