2012-05-07 33 views
14

tengo que configurar algunos campos de cabecera HTTP en un cliente Apache CXF:Apache CXF - Conjunto de la cabecera HTTP

lo probé a través del interceptor:

public class HttpHeaderInterceptor extends AbstractPhaseInterceptor<Message> { 

    private String userId; 
    private String xAuthorizeRoles; 
    private String host; 


    public HttpHeaderInterceptor() { 
     super(Phase.POST_PROTOCOL); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS); 
     try { 
      System.out.println("HttpHeaderInterceptor Host: " + host + " UserId: " + userId + " X-AUTHORIZE-roles: " + xAuthorizeRoles); 
      headers.put("Host", Collections.singletonList(host)); 
      headers.put("UserId", Collections.singletonList(userId)); 
      headers.put("X-AUTHORIZE-roles", Collections.singletonList(xAuthorizeRoles)); 
     } catch (Exception ce) { 
      throw new Fault(ce); 
     } 
    } 

    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    public void setxAuthorizeRoles(String xAuthorizeRoles) { 
     this.xAuthorizeRoles = xAuthorizeRoles; 
    } 

    public void setHost(String host) { 
     this.host = host; 
    } 
} 

en mi clase de clientes de forma dinámica la méthode:

public void setHttHeaderInterceptor(String userId, String xAuthorizeRoles){ 
    Client cxfClient = ClientProxy.getClient(this.abgWebServicePort); 
    HttpHeaderInterceptor httpHeaderInterceptor = new HttpHeaderInterceptor(); 
    httpHeaderInterceptor.setHost("example.org"); 
    httpHeaderInterceptor.setUserId(userId); 
    httpHeaderInterceptor.setxAuthorizeRoles(xAuthorizeRoles); 
    cxfClient.getOutInterceptors().add(httpHeaderInterceptor); 
} 

se llama antes de invocar el servicio remoto:

para cada llamada el ID de usuario y la xAuthorizeRol Esto debe variar, pero cuando inspecciono mediante llamadas a través de tcpdump, todas las llamadas tienen los mismos valores en los campos del encabezado.

¿Alguna idea?

+0

ver también http://stackoverflow.com/q/3165647/55452 –

+0

que no resuelve mi problema – Alex

Respuesta

12

he resuelto mi problema:

añadiendo el interceptor a través de configuración xml:

<jaxws:client id="clientBean" serviceClass="org.example.service.ServicePortType" 
       address="example.org/src/service/ServicePort"> 
    <jaxws:outInterceptors> 
     <bean class="org.example.interceptor.HttpHeaderInterceptor"/> 
    </jaxws:outInterceptors> 
    <jaxws:properties> 
     <entry key="mtom-enabled" value="true"/> 
    </jaxws:properties> 
</jaxws:client> 

en la clase de cliente Alteré setHttpHeaderInterceptor a

public void setHttpHeaderInterceptor(String userId, String xAuthorizeRoles){ 
    Client cxfClient = ClientProxy.getClient(this.servicePort); 
    cxfClient.getRequestContext().put("HTTP_HEADER_HOST", "example.org"); 
    cxfClient.getRequestContext().put("HTTP_HEADER_USER_ID", userId); 
    cxfClient.getRequestContext().put("HTTP_HEADER_X_AUTHORIZE-ROLES", xAuthorizeRoles); 
} 

la clase interceptor

@Override 
    public void handleMessage(Message message) throws Fault { 
     Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS); 
     try { 
      headers.put("Host", Collections.singletonList(message.get("HTTP_HEADER_HOST"))); 
      headers.put("KD_NR", Collections.singletonList(message.get("HTTP_HEADER_KD_NR"))); 
      headers.put("X-AUTHORIZE-roles", Collections.singletonList(message.get("HTTP_HEADER_X_AUTHORIZE-ROLES"))); 
     } catch (Exception ce) { 
      throw new Fault(ce); 
     } 
    } 

y ahora funciona.

Con este enfoque puedo establecer los campos de cabecera HTTP en tiempo de ejecución.

+0

Necesito conseguir session_id cabecera cxf y enviarlo por axis2. entonces, ¿cómo hacer eso? -gracias –

1

Usted debería haber utilizado: Phase.POST_LOGICAL en lugar de Phase.POST. Esto funcionó para mí

+0

por la documentación, no parecía ser la fase de hacer esto; Dicho esto, esa modificación funcionó en torno a un problema en el que CXF parecía estar ignorando aleatoriamente los encabezados. –

1

Aquí es un fragmento de código para copiar un encabezado HTTP personalizado (a partir de la solicitud) sobre la respuesta en un solo CXF a cabo interceptor.

public void handleMessage(SoapMessage message) throws Fault { 
    // Get request HTTP headers 
    Map<String, List<String>> inHeaders = (Map<String, List<String>>) message.getExchange().getInMessage().get(Message.PROTOCOL_HEADERS); 
    // Get response HTTP headers 
    Map<String, List<String>> outHeaders = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS); 
    if (outHeaders == null) { 
     outHeaders = new HashMap<>(); 
     message.put(Message.PROTOCOL_HEADERS, outHeaders); 
    } 
    // Copy Custom HTTP header on the response 
    outHeaders.put("myCustomHTTPHeader", inHeaders.get("myCustomHTTPHeader")); 
} 
0

Si es necesario para establecer el encabezado HTTP estándar, puede hacerlo también utilizando http conduit.

<http-conf:conduit 
     name="*.http-conduit"> 
<http-conf:client AllowChunking="false" AcceptEncoding="gzip,deflate" Connection="Keep-Alive" 
Host="myhost.com"/> 
</http-conf:conduit> 
Cuestiones relacionadas