Alex Alex - 5 months ago 42
Apache Configuration Question

Apache CXF - Set HTTP header

I have to set some http header fields in a Apache CXF client:

I tried it via Interceptor:

public class HttpHeaderInterceptor extends AbstractPhaseInterceptor<Message> {

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

public HttpHeaderInterceptor() {

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) { = host;

in my dynamic client class the methode:

public void setHttHeaderInterceptor(String userId, String xAuthorizeRoles){
Client cxfClient = ClientProxy.getClient(this.abgWebServicePort);
HttpHeaderInterceptor httpHeaderInterceptor = new HttpHeaderInterceptor();

is called before I invoke the remote service:

For each call the userId and the xAuthorizeRoles should vary but when I inspect by calls via tcpdump all calls have the same values in the header fields.

Any ideas?


I Have solved my problem:

adding the interceptor via xml configuration:

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

in the client class I altered setHttpHeaderInterceptor to

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

the interceptor class

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

and now it work's.

With this approach I can set HTTP-Header fields at runtime.