it-swarm.com.de

Apache CXF - Setzen Sie den HTTP-Header

Ich muss einige HTTP-Header-Felder in einem Apache CXF-Client festlegen:

Ich habe es über Interceptor ausprobiert:

    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-Dienst aufrufe:

Bei jedem Aufruf sollten userId und xAuthorizeRoles variieren. Wenn ich jedoch Aufrufe über tcpdump durchsehe, haben alle Aufrufe die gleichen Werte in den Headerfeldern.

Irgendwelche Ideen?

15
Alex

Ich habe mein Problem gelöst:

hinzufügen des Interceptors über die XML-Konfiguration:

<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 habe ich setHttpHeaderInterceptor in 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 Interceptor-Klasse 

@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 klappt's.

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

14
Alex

Sie sollten Folgendes verwenden: Phase.POST_LOGICAL anstelle von Phase.POST. Das hat für mich funktioniert

1
NVN

Hier ist ein Code-Snippet zum Kopieren eines benutzerdefinierten HTTP-Headers (aus der Anforderung) auf die Antwort in einem einzelnen CXF-Out-Interceptor. 

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"));
}
1
Floppyr

Wenn ein Standard-HTTP-Header festgelegt werden muss, kann dies auch über den HTTP-Conduit erfolgen.

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