2012-05-07 16 views
14

Ich habe einige http-Header-Felder in einem Apache CXF-Client eingerichtet:Apache CXF - Set HTTP-Header

ich es über Interceptor versucht:

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

in meiner dynamischen Client-Klasse die 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); 
} 

wird aufgerufen, bevor ich den Remote-Service aufrufen:

jeweils Für die userId nennen und die xAuthorizeRol Es sollte variieren, aber wenn ich durch Anrufe über tcpdump inspiziere, haben alle Anrufe die gleichen Werte in den Kopffeldern.

Irgendwelche Ideen?

+0

siehe auch http://stackoverflow.com/q/3165647/55452 –

+0

, das nicht mein Problem lösen – Alex

Antwort

12

Ich habe mein Problem gelöst:

die Abfangjäger über XML-Konfiguration hinzufügen:

<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> 

in der Client-Klasse-I-setHttpHeaderInterceptor zu

geändert
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); 
} 

die Interzeptorklasse

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

und jetzt ist es Arbeit.

Mit diesem Ansatz kann ich HTTP-Header-Felder zur Laufzeit festlegen.

+0

i cxf Header Sitzungs_ID und senden es über axis2 erhalten müssen. dann, wie man das macht. -thanks –

1

Sie sollten Phase.POST_LOGICAL statt Phase.POST verwenden. Dies funktionierte für mich

+0

Laut der Dokumentation schien es nicht die Phase dafür zu sein; Diese Änderung funktionierte jedoch um ein Problem herum, bei dem CXF die Header zufällig zu ignorieren schien. –

1

Hier ist ein Code-Snippet, um einen benutzerdefinierten HTTP-Header (aus der Anfrage) auf die Antwort in einem einzigen CXF-Interceptor zu kopieren.

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

Falls erforderlich, um den Standard-HTTP-Header festzulegen, kann dies auch mit http-Conduit durchgeführt werden.

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