2012-05-07 39 views
14

tôi phải thiết lập một số lĩnh vực tiêu đề http trong một client Apache CXF:Apache CXF - Set HTTP header

Tôi đã thử nó qua 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; 
    } 
} 

trong lớp khách hàng năng động của tôi tole:

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

được gọi là trước khi tôi gọi dịch vụ từ xa:

Đối với mỗi gọi userId và xAuthorizeRol es nên thay đổi nhưng khi tôi kiểm tra bằng các cuộc gọi qua tcpdump, tất cả các cuộc gọi có cùng giá trị trong các trường tiêu đề.

Bất kỳ ý tưởng nào?

+0

xem thêm http://stackoverflow.com/q/3165647/55452 –

+0

rằng đã không giải quyết vấn đề của tôi – Alex

Trả lời

12

Tôi đã giải quyết vấn đề của tôi:

thêm đánh chặn thông qua cấu hình xml:

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

trong lớp client tôi thay đổi setHttpHeaderInterceptor để

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

lớp đánh chặn

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

và bây giờ nó hoạt động.

Với cách tiếp cận này, tôi có thể đặt trường HTTP-Header khi chạy.

+0

tôi cần để có được CXF tiêu đề session_id và gửi nó qua axis2. sau đó làm thế nào để làm điều đó. -thanks –

1

Bạn nên sử dụng: Phase.POST_LOGICAL thay vì Phase.POST. Điều này làm việc cho tôi

+0

Mỗi tài liệu, nó dường như không phải là giai đoạn để làm điều này; điều đó đang được nói, sự sửa đổi đó đã làm việc xung quanh một vấn đề mà CXF dường như ngẫu nhiên bỏ qua các tiêu đề. –

1

Dưới đây là đoạn mã để sao chép tiêu đề HTTP tùy chỉnh (từ yêu cầu) trên phản hồi trong một thiết bị chặn ngoài CXF.

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

Nếu được yêu cầu đặt tiêu đề HTTP chuẩn thì có thể thực hiện bằng cách sử dụng đường dẫn http.

<http-conf:conduit 
     name="*.http-conduit"> 
<http-conf:client AllowChunking="false" AcceptEncoding="gzip,deflate" Connection="Keep-Alive" 
Host="myhost.com"/> 
</http-conf:conduit> 
Các vấn đề liên quan