2013-02-05 10 views
9

मैं नेटबीन्स का उपयोग स्वचालित रूप से डब्ल्यूएसडीएल फ़ाइलों के आधार पर webservice क्लाइंट बनाने के लिए कर रहा हूं। यह अच्छी तरह से काम करता है, मैं जिस वेबस्वाइसेस का उपयोग कर रहा हूं, उसे छोड़कर मैं अपनी पहचान साबित करने के लिए प्रत्येक वेब सेवा के लिए HTTP शीर्षलेख में एक कस्टम कुकी में पास करता हूं।जेएक्स-डब्ल्यूएस क्लाइंट: कई सेवाओं में सत्र/कुकीज़ बनाए रखें

मैं अपने प्राधिकरण प्राप्त करने के लिए Utility नामक एक webservice का उपयोग करता हूं। यह एक कुकी सेट करता है जिसे किसी भी webservice पर आने वाली सभी कॉलों में प्रदान करने की आवश्यकता होती है।

यह वेब सेवा के लिए बंदरगाह के बाध्यकारी प्रदाता पर javax.xml.ws.session.maintaintrue सेट करके पूरा किया जा सकता है। यह Utility webservice में विधियों के बाद की कॉल के लिए बहुत अच्छा काम करता है। समस्या यह है कि यह केवल उस एकल webservice के लिए सत्र/कुकी रखता है। मुझे इसे दूसरों के साथ भी चाहिए।

मुझे अलग वेबसाइम History नामित कुकी की आवश्यकता है, मैं इसे कैसे पूरा कर सकता हूं? क्या यह एक सुपर सर्विस क्लास होना संभव है जो उपयोगिता और इतिहास दोनों ही सत्र सत्र को बढ़ा और साझा कर सके?

उत्तर

14

मुझे एक समाधान मिला है।

आप इस का उपयोग कर प्रतिक्रिया हेडर प्राप्त कर सकते हैं के बाद आप कॉल कर दिया है:

((BindingProvider)port).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); 

Set-Cookie हैडर का पता लगाएं और अपने मूल्य की दुकान।

((BindingProvider)port).getRequestContext().put(
      MessageContext.HTTP_REQUEST_HEADERS, 
       Collections.singletonMap("Cookie", Collections.singletonList(cookieValue) 
      ) 
     ); 
+0

शायद आपको कुकी को निकालने के लिए यह जोड़ना होगा, इस तरह से केवल पहली कॉल के बाद ही संभव है - क्योंकि केवल "सेट-कुकी" सेट है। लेकिन फिर भी ... बहुत बहुत धन्यवाद। यह मुझे बहुत समय बचाया। – cljk

3

बस टिप्पणी क्योंकि समाधान ऊपर मेरे लिए काम नहीं किया:

तो (किसी भी वेब सेवा में) अपने अगले अनुरोध इससे पहले कि आप कुकी शीर्ष लेख सेट कर सकते हैं। मुझे असमर्थितऑपरेशन अपवाद मिला। मेरा मानना ​​है कि समस्या उत्पन्न हुई क्योंकि सिंगलटन मैप परिवर्तनों की अनुमति नहीं देता है। एक्सएमएल हेडर की भी आवश्यकता थी, इसलिए मैंने उन्हें पहले सेट किया।

Map<String, List<String>> headers= CastUtils.cast((Map)port.getRequestContext().get("javax.xml.ws.http.request.headers")); 
if (headers == null) { 
    headers = new HashMap<String, List<String>>(); 
    port.getRequestContext().put("javax.xml.ws.http.request.headers", headers); 
} 

headers.put("Cookie", Collections.singletonList(cookieValue)); 
((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
+0

हां, सिंगलटन मैप्स अपरिवर्तनीय हैं - मैंने इसे केवल – bradvido

+1

सुविधा के रूप में उपयोग किया है, आपको इसे संदेश कॉम्पैक्ट प्राप्त करने के लिए कोड की समीक्षा करनी चाहिए, MessageContext.HTTP_REQUEST_HEADERS == "javax.xml.ws.http.request.headers" –

+0

वास्तव में उनका संस्करण वास्तव में है उद्धरण समेत एक चार छोटा भी, लेकिन मुझे पता है कि आपका क्या मतलब है। निरंतर उपयोग करना निश्चित रूप से सुरक्षित है। :) – Martin

संबंधित मुद्दे