IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

CXF - Interceptor et Phases


Sujet :

Services Web Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Par défaut CXF - Interceptor et Phases
    Salut à tous,

    Je me retrouve actuellement confronté à un soucis majeur sur le développement d'une application Client/Serveur utilisant CXF.

    J'en suis encore aux balbutiements sur cette technologie et je pense ne pas tout saisir sur son fonctionnement. J'ai longuement lu le tutoriel de Apache CXF, et cherché en vain sur internet une réponse à mon problème, et je me sens dans l'obligation de requérir votre aide.


    Je souhaiterais qu'à chaque requête de mon client vers mon serveur le nom d'utilisateur soit envoyé dans le message. Cela permettra à mon serveur de certifier la provenance des requêtes à chaque appel d'un service sur mon serveur Web.

    J'ai tenté de créer un Interceptor côté serveur pour récupérer le nom d'utilisateur, et créer un autre interceptor côté client qui lui se chargerait d'intégrer le nom d'utilisateur (ou une quelconque information) au message SOAP.

    L'interceptor côté client se chargeant de garder le nom d'utilisateur est placé dans le outInterceptor chain. Il s'appelle UserNameInterceptor et il étend AbstractPhaseInterceptor<Message>

    L'interceptor côté serveur se charge de récupérer (en théorie) le nom d'utilisateur pour certifier la provenance des messages. Il est ajouté par une annotation à mon web service :
    @InInterceptors(interceptors = { interceptor.UserInterceptor })


    Mes questions seront donc multiples :

    Comment arriver à envoyer un message 'SOAP' contenant le nom d'utilisateur (ou autrement dit : comment ajouter ses propres informations dans un message soap) ?

    Je me suis inspiré de : http://cxf.apache.org/docs/interceptors.html pour écrire mon code.


    Je tiens à préciser tout de même que je récupère l'adresse IP par l'utilisation côté serveur d'une interceptor utilisant le code suivant :

    HttpServletRequest request = (HttpServletRequest) message
    .get(AbstractHTTPDestination.HTTP_REQUEST);

    Cette classe propose également de récupérer le nom d'utilisateur, mais ça n'est pas celui que je veux. Je veux pouvoir passer explicitement un nom d'utilisateur (ou une information quelconque) dans mon message SOAP.

    Tout semble simple d'après le tuto, mais je sèche sévèrement sur ce problème...

    Merci à ceux qui prendront le temps de me répondre.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Par défaut Une solution
    Je me réponds à moi-même, mais ça pourrait surement servir à d'autres.

    Alors j'ai enfin réussi à envoyer des données en utilisant le Header SOAP. Pour se faire voici le code client qui ajoute au header le champ UserInfo contenant le nom drakss :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    BindingProvider bindingProvider = (BindingProvider) connection;
     
    ArrayList<Handler>();
     
    List<Header> headers = (List<Header>) bindingProvider.getRequestContext().get(Header.HEADER_LIST);
    if (headers == null) {
        headers = new ArrayList<Header>();
        bindingProvider.getRequestContext().put(Header.HEADER_LIST, headers);
    }
    try {
        Header userNameHeader;
        userNameHeader = new Header(new QName("uri:org.apache.cxf", "userInfo"), "drakss", new JAXBDataBinding(String.class));
        headers.add(userNameHeader);
     
    } catch (JAXBException ex) {
        Logger.getLogger(EncryptedConnection.class.getName()).log(Level.SEVERE, null, ex);
    }


    Et le code serveur pour récupérer l'information dans le header :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class UserInterceptor extends AbstractSoapInterceptor {
     
    	private static String userName;
     
    	public static String getUserName() {
    		return userName;
    	}
     
    	public UserInterceptor() {
    		super(Phase.USER_LOGICAL);
    	}
     
    	@Override
    	public void handleMessage(SoapMessage message) throws Fault {
    		List<Header> headers = message.getHeaders();
    		for (Header header : headers) {
    			Element el = ((Element) header.getObject());// .getA.getAttribute(name)
    			Node node = DOMUtils.getChild(el, null);
    			XMLUtils.printDOM(el);
    			userName = el.getTextContent();
    			System.out
    					.println("[UserInteceptor] handlerMessage - text content ?"
    							+ el.getTextContent());
    		}
    	}
    }

  3. #3
    Invité de passage
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Par défaut
    salut,

    Je rencontre le même soucis que toi afin de modifier un message avant envois.

    Peux tu me dire comment intégrer ton code!! A quoi correspond la variable connection ??


    Merci,

    Guillaume

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CXF Interceptor SoapMessage
    Par willoi dans le forum Services Web
    Réponses: 2
    Dernier message: 08/11/2010, 14h31
  2. FFT et phase
    Par fred-ql dans le forum C++
    Réponses: 28
    Dernier message: 07/02/2008, 13h24
  3. Rémunération : phase d'analyse
    Par Jos dans le forum Structure
    Réponses: 1
    Dernier message: 16/08/2005, 09h10
  4. Utilisation d'une phase prototypage dans un projet info
    Par Kiki31 dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 28/07/2005, 20h44
  5. PostgreSQL two-phase commit
    Par will82 dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 10/02/2005, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo