2012-05-07 13 views
14

devo impostare alcuni campi di intestazione http in un client Apache CXF:Apache CXF - Set HTTP

ho provato via 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; 
    } 
} 

nella mia classe cliente dinamica Methode:

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); 
} 

viene chiamato prima invoco il servizio remoto:

Per ogni chiamata l'ID utente e la xAuthorizeRol dovrebbe variare, ma quando controllo le chiamate via tcpdump tutte le chiamate hanno gli stessi valori nei campi dell'intestazione.

Qualche idea?

+0

vedi anche http://stackoverflow.com/q/3165647/55452 –

+0

che non ha risolto il mio problema – Alex

risposta

12

Ho risolto il mio problema:

aggiungendo l'intercettore tramite configurazione 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> 

nella classe client ho modificato 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 classe 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); 
     } 
    } 

e ora funziona.

Con questo approccio posso impostare i campi HTTP-Header in fase di esecuzione.

+0

ho bisogno di ottenere CXF intestazione session_id e inviarlo via axis2. allora come si fa? -thanks –

1

Avresti dovuto utilizzare: Phase.POST_LOGICAL anziché Phase.POST. Questo ha funzionato per me

+0

Per la documentazione, non sembra essere la fase per farlo; detto questo, quella modifica ha funzionato intorno a un problema in cui CXF sembrava ignorare casualmente le intestazioni. –

1

Ecco uno snippet di codice per copiare un'intestazione HTTP personalizzata (dalla richiesta) sulla risposta in un singolo intercettore CXF.

0

Se necessario per impostare l'intestazione HTTP standard, è possibile utilizzare anche il conduit http.

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