Apache CXF - Définir l'en-tête HTTP
J'ai pour définir certains champs d'en-tête http dans un Apache CXF client:
Je l'ai essayé par 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;
}
}
dans mon client dynamique de la classe de 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);
}
est appelé avant que j'ai appeler le service à distance:
Pour chaque appel, le nom d'utilisateur et le xAuthorizeRoles devrait varier, mais quand j'ai inspecter par des appels via tcpdump tous les appels ont les mêmes valeurs dans les champs d'en-tête.
Des idées?
source d'informationauteur Alex
Vous devez vous connecter pour publier un commentaire.
J'Ai résolu mon problème:
l'ajout de l'intercepteur via xml de configuration:
dans la classe client j'ai modifié setHttpHeaderInterceptor à
de l'intercepteur de classe
et maintenant il travail.
Avec cette approche, je peux mettre HTTP champs d'en-Tête lors de l'exécution.
Vous devriez avoir utilisé :
Phase.POST_LOGICAL
au lieu dePhase.POST
. Cela a fonctionné pour moiVoici un extrait de code pour copier un en-tête HTTP personnalisé (à partir de la demande) sur la réponse en un seul CXF hors de l'intercepteur.
Si nécessaire pour définir la norme en-tête HTTP, alors il peut être fait à l'aide de http conduit également.