Saltar al contenido

Recuperando el encabezado de Soap en el lado del servidor JAXWS

Recuerda que en la informática cualquier problema puede tener diferentes soluciones, por lo tanto enseñamos lo más óptimo y mejor.

Solución:

Puede leer el encabezado del jabón en el SOAPMessageContext en un SOAPHandler clase, luego pase los valores a su @WebService implementación a través de attributes en el MessageContext.

Mientras que el HeaderList La API es específica de la implementación de referencia de JAX-WS, el siguiente ejemplo debe ser portátil en cualquier tiempo de ejecución de JAX-WS.

Ejemplo:

Implicación del servicio web:

package org.example.sampleservice;

import javax.annotation.Resource;
import javax.jws.HandlerChain;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;

@WebService(endpointInterface = "org.example.sampleservice.SampleService")
@HandlerChain(file="handlers.xml")
public class SampleServiceImpl implements SampleService 

    @Resource
    private WebServiceContext ctx;

    @Override
    public String sayHello(String name) 
        String usernameFromHeader = (String) ctx.getMessageContext().get("USERNAME");
        return "Hello, "
                + name
                + " (invoked by "
                + (usernameFromHeader == null ? "[err or no 'Security' header found]"
                        : usernameFromHeader) + ")";
    


XML de cadena de controlador (handlers.xml, un archivo en el mismo paquete que SampleServiceImpl.java):



  
    
      org.example.sampleservice.UsernameTokenHandler
    
  

La clase de controlador JAX-WS:

package org.example.sampleservice;

import java.util.Iterator;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.Node;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.MessageContext.Scope;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class UsernameTokenHandler implements SOAPHandler 

    private static final String WSSE_NS_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
    private static final QName QNAME_WSSE_USERNAMETOKEN = new QName(WSSE_NS_URI, "UsernameToken");
    private static final QName QNAME_WSSE_USERNAME = new QName(WSSE_NS_URI, "Username");
    private static final QName QNAME_WSSE_PASSWORD = new QName(WSSE_NS_URI, "Password");

    @Override
    public boolean handleMessage(SOAPMessageContext context) 

        Boolean outbound = (Boolean) context
                .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if ((outbound != null) && (!outbound.booleanValue())) 
            handleInboundMessage(context);
        
        return true;
    

    private void handleInboundMessage(SOAPMessageContext context) 
        String wsseUsername = null;
        String wssePassword = null;
        try 
            SOAPHeader header = context.getMessage().getSOAPHeader();
            Iterator headerElements = header.examineAllHeaderElements();
            while (headerElements.hasNext()) 
                SOAPHeaderElement headerElement = (SOAPHeaderElement) headerElements
                        .next();
                if (headerElement.getElementName().getLocalName()
                        .equals("Security")) 
                    SOAPHeaderElement securityElement = headerElement;
                    Iterator it2 = securityElement.getChildElements();
                    while (it2.hasNext()) 
                        Node soapNode = (Node) it2.next();
                        if (soapNode instanceof SOAPElement) 
                            SOAPElement element = (SOAPElement) soapNode;
                            QName elementQname = element.getElementQName();
                            if (QNAME_WSSE_USERNAMETOKEN.equals(elementQname)) 
                                SOAPElement usernameTokenElement = element;
                                wsseUsername = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_USERNAME);
                                wssePassword = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_PASSWORD);
                                break;
                            
                        

                        if (wsseUsername != null) 
                            break;
                        
                    
                
                context.put("USERNAME", wsseUsername);
                context.setScope("USERNAME", Scope.APPLICATION);

                context.put("PASSWORD", wssePassword);
                context.setScope("PASSWORD", Scope.APPLICATION);
            
         catch (Exception e) 
            System.out.println("Error reading SOAP message context: " + e);
            e.printStackTrace();
        

    

    private String getFirstChildElementValue(SOAPElement soapElement, QName qNameToFind) 
        String value = null;
        Iterator it = soapElement.getChildElements(qNameToFind);
        while (it.hasNext()) 
            SOAPElement element = (SOAPElement) it.next(); //use first
            value = element.getValue();
        
        return value;
    

    @Override
    public boolean handleFault(SOAPMessageContext context) 
        return false;
    

    @Override
    public void close(MessageContext context) 
    


    @Override
    public Set getHeaders() 
        return null;
    


Reseñas y calificaciones

Si te gusta la programación, tienes la libertad de dejar un post acerca de qué te ha gustado de este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *