2012-05-07 20 views
14

मैं एक अपाचे CXF ग्राहक में कुछ http शीर्ष लेख फ़ील्ड सेट करने के लिए:अपाचे CXF - सेट HTTP हेडर

मैं इंटरसेप्टर के माध्यम से इसे करने की कोशिश:

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; 
    } 
} 
मेरी गतिशील ग्राहक वर्ग में

methode:

प्रत्येक के लिए userId और xAuthorizeRol फोन:

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

इससे पहले कि मैं दूरस्थ सेवा शुरू कहा जाता है es अलग-अलग होना चाहिए, लेकिन जब मैं tcpdump के माध्यम से कॉल द्वारा निरीक्षण करता हूं तो सभी कॉलों में हेडर फ़ील्ड में समान मान होते हैं।

कोई भी विचार?

+0

भी http://stackoverflow.com/q/3165647/55452 –

+0

कि मेरी समस्या का समाधान नहीं – Alex

उत्तर

12

मैं मेरी समस्या हल है:

एक्सएमएल विन्यास के माध्यम से इंटरसेप्टर जोड़ने:

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

इंटरसेप्टर वर्ग के लिए ग्राहक वर्ग मैं setHttpHeaderInterceptor बदल में

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

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

और अब यह काम करता है।

इस दृष्टिकोण के साथ मैं रनटाइम पर HTTP-शीर्षलेख फ़ील्ड सेट कर सकता हूं।

+0

मैं CXF हैडर session_id हो और Axis2 के माध्यम से इसे भेजने की जरूरत है देखते हैं। तो यह कैसे करें। - धन्यवाद –

1

आपको Phase.POST के बजाय Phase.POST_LOGICAL का उपयोग करना चाहिए था। यह मेरे लिए काम करता है

+0

प्रलेखन के अनुसार, ऐसा करने के लिए यह चरण प्रतीत नहीं होता था; कहा जा रहा है कि, संशोधन ने एक समस्या के आसपास काम किया जहां सीएक्सएफ हेडर को यादृच्छिक रूप से अनदेखा कर रहा था। –

1

यहां एक सीएक्सएफ आउट इंटरसेप्टर में प्रतिक्रिया पर एक कस्टम HTTP शीर्षलेख (अनुरोध से) की प्रतिलिपि बनाने के लिए एक कोड स्निपेट है।

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

तो मानक HTTP हेडर तो स्थापित करने के लिए आवश्यक यह भी http नाली का उपयोग किया जा सकता है।

<http-conf:conduit 
     name="*.http-conduit"> 
<http-conf:client AllowChunking="false" AcceptEncoding="gzip,deflate" Connection="Keep-Alive" 
Host="myhost.com"/> 
</http-conf:conduit> 
संबंधित मुद्दे