2011-04-12 8 views
8

He buscado en esto y he encontrado algunas fallas. Creé un cliente Java para consumir un servicio web usando JAX-WS. ¿Hay alguna forma de usar JAX para establecer el valor de HTTP_USER_AGENT? Me gustaría tener el registro de mi servicio web cuando los clientes específicos (el mío) accedan a él, así que quería un valor personalizado.Uso de JAX-WS: cómo puedo configurar la propiedad del agente de usuario

He visto opciones donde lo configura en las propiedades del sistema, pero parece que esto no funciona. Las clases JAX generadas no parecen tener una referencia directa al objeto de conexión, así que no veo cómo puedo manipular esas clases.

Cualquier ayuda sería genial. Gracias ST

Respuesta

2

no está seguro de si este es el mejor/manera más directa de hacerlo, pero creo que se podría añadir un javax.xml.ws.handler.Handler personalizado a la cadena de manejador en el despacho javax.xml .ws.Encuadernación. en el controlador, debe poder establecer un mapa personalizado de encabezados http adicionales en el MessageContext saliente utilizando la propiedad MessageContext.HTTP_REQUEST_HEADERS.

2

Déjame preguntarte la idea de tener el encabezado HTTP primero.

Un enfoque más correcto (WS-céntrico) es establecer el encabezado SOAP, no el encabezado HTTP. Considere esto: los mensajes SOAP pueden ser entregados no solo por HTTP, sino por JMS, SMTP o transportes personalizados. Al requerir tener el encabezado HTTP de agente de usuario, no necesita vincular su código a un solo transporte, aunque actualmente prevalezca.

Esta es la razón por la cual JAX-WS no tiene ninguna noción de encabezados HTTP, excepto en los controladores.

Y (por supuesto) StackOverlow knows cómo crear encabezados SOAP.

11

La solución a este tipo de problema en JAX-WS es implementar un controlador de SoapMessage (interfaz: SOAPHandler < SOAPMessageContext>). Dentro de ese controlador, inserte su encabezado HTTP en encabezados quizás ya existentes, luego le da el control al siguiente controlador en la cadena de controladores.

El concepto de esta cadena de manipuladores es agradable, puede tener clases pequeñas para un propósito muy específico (Seguridad, Registro, etc.).

En su cliente se configura el controlador de la cadena antes de enviar cualquier solicitud:

// HandlerChain installieren 
Binding binding = ((BindingProvider) port).getBinding(); 
List hchain = binding.getHandlerChain(); 
if (hchain == null) { 
    hchain = new ArrayList(); 
} 
hchain.add(new HTTPUserAgentHandler()); 
binding.setHandlerChain(hchain); 

Y aquí es el código de la HTTPUserAgentHandler:

public class HTTPUserAgentHandler implements SOAPHandler<SOAPMessageContext> { 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     boolean request = ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (request) { 
      @SuppressWarnings("unchecked") 
      Map<String, List<String>> headers = (Map<String, List<String>>) context 
        .get(MessageContext.HTTP_REQUEST_HEADERS); 
      if (null == headers) { 
       headers = new HashMap<String, List<String>>(); 
      } 
      headers.put("HTTP_USER_AGENT", Collections.singletonList("user_agent")); 
      context.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
     } 
     return true; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) {} 

    @Override 
    public Set<QName> getHeaders() { 
     return null; 
    } 

} 
+0

bien hecho. Trabajó para mi. Gracias. – yngwietiger

Cuestiones relacionadas