Apache CXF - Set HTTP header
apache, cxf, header, interceptor
Solution
I Have solved my problem:
adding the interceptor via xml configuration:
<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 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", "example.org");
cxfClient.getRequestContext().put("HTTP_HEADER_USER_ID", userId);
cxfClient.getRequestContext().put("HTTP_HEADER_X_AUTHORIZE-ROLES", xAuthorizeRoles);
}
the interceptor class
@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);
}
}
and now it work's.
With this approach I can set HTTP-Header fields at runtime.
Problem
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() { 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 my dynamic client class the 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); } ``` 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?