web-dev-qa-db-fra.com

Comment puis-je ajouter un SOAP En-tête utilisant Java JAX-WS

Une demande client typique SOAP utilisant JAX-WS peut être

FooService service = new FooService();
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);

Cela génère un contenu de requête HTTP similaire à

<?xml ... ?>
<S:Envelope xmlns:S="http://...soap-envelope">
  <S:Body>
    <!-- payload -->
  </S:Body>
</S:Envelope>

En manipulant les arguments de l'appel port.processRequest (), vous ne pouvez affecter que la partie "payload". Vous ne pouvez pas affecter la partie externe du message XML.

Je veux insérer un en-tête SOAP juste avant le corps de SOAP 

<S:Header>
   <X:Security xmlns:X="http://...wsssecurity...>
      <X:BinarySecurityToken>kjh...897=</X:BinarySecurityToken>
   </X:Security>
</S:Header>

Comment je fais ça? 

23
RedGrittyBrick

Merci Nuno,

Dès que je saurai comment me connecter correctement à stackoverflow.com, je vous répondrai de la bonne manière.

En attendant voici le code avec lequel je me suis retrouvé:

FooService service = new FooService();
service.setHandlerResolver(new HandlerResolver() {
    public List<Handler> getHandlerChain(PortInfo portInfo) {
        List<Handler> handlerList = new ArrayList<Handler>();
        handlerList.add(new RGBSOAPHandler());
        return handlerList;
    }
});
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);

et

class RGBSOAPHandler implements SOAPHandler<SOAPMessageContext> {

    public Set<QName> getHeaders() {
        return new TreeSet();
    }

    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outboundProperty = 
            (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outboundProperty.booleanValue()) {
            SOAPMessage message = context.getMessage();
            try {
                SOAPEnvelope envelope = context.getMessage()
                        .getSOAPPart().getEnvelope();
                SOAPFactory factory = SOAPFactory.newInstance();
                String prefix = "X";
                String uri = "http://...wsssecurity...";
                SOAPElement securityElem = 
                        factory.createElement("Security",prefix,uri);
                SOAPElement tokenElem = 
                        factory.createElement("BinarySecurityToken",prefix,uri);
                tokenElem.addTextNode("kjh...897=");
                securityElem.addChildElement(tokenElem);
                SOAPHeader header = envelope.addHeader();
                header.addChildElement(securityElem);

            } catch (Exception e) {
                System.out.println("Exception in handler: " + e);
            }
        } else {
            // inbound
        }
        return true;
    }

    public boolean handleFault(SOAPMessageContext context) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void close(MessageContext context) {
        //
    }
}
18
RedGrittyBrick

vous voudrez peut-être examiner les gestionnaires et les chaînes de gestionnaires. J'ai récemment dû ajouter un cookie à un appel Webservice donné. C'est ainsi que je l'ai fait. les en-têtes d'appel avec un gestionnaire de pivot

1
Nuno Furtado

pour ajouter un en-tête Soap, si vous implémentez les services Web sur le serveur d'applications Web, Was ajoutera une partie de sécurité au niveau de l'en-tête, après avoir été configuré conformément à la norme WS-SECURITY, telle qu'une stratégie Web, etc. ajoutez-vous sauf la partie de contenu cryptée, telle que le mot de passe crypté, etc. 

0
Fairymaiden