2012-09-05 17 views
5

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

मैं समझ नहीं पा रहा हूं कि वेब सेवा कैसे बनाएं, जहां SOAP शीर्षलेख में कुछ तत्व होंगे (मेरे मामले में, प्रमाणीकरण तत्व जैसे उपयोगकर्ता आईडी और पासवर्ड)।

आम तौर पर, सेवा में जो भी तरीका उजागर किया गया है वह एसओएपी बॉडी के हिस्से के रूप में आएगा। इसलिए एसओएपी हैडर में प्रमाणीकरण तत्व जोड़ने के साथ आगे बढ़ने के लिए भ्रमित।

कृपया मदद

सादर,

+0

क्या कोई इसे देख सकता है? https://stackoverflow.com/questions/43002576/soap-header-xmlnsds-on-each-element-for-xml-ignature- जनरेशन –

उत्तर

4

हाल ही में मैं एक वर्ग जो SOAP शीर्षक के उपयोगकर्ता क्रेडेंशियल कहते लिखा है। ऐसा करने के लिए आपको एक कक्षा बनाने की आवश्यकता है जो SOAPHandler<SOAPMessageContext> इंटरफ़ेस लागू करता है। के लिए उदा .:

public class MyHandler implements SOAPHandler<SOAPMessageContext> { 

    private static final Logger LOGGER = LoggerFactory.getLogger(MyHandler.class); 

    private String username; 

    private String password; 

    /** 
    * Handles SOAP message. If SOAP header does not already exist, then method will created new SOAP header. The 
    * username and password is added to the header as the credentials to authenticate user. If no user credentials is 
    * specified every call to web service will fail. 
    * 
    * @param context SOAP message context to get SOAP message from 
    * @return true 
    */ 
    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     try { 
      SOAPMessage message = context.getMessage(); 
      SOAPHeader header = message.getSOAPHeader(); 
      SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); 
      if (header == null) { 
       header = envelope.addHeader(); 
      } 
      QName qNameUserCredentials = new QName("https://your.target.namespace/", "UserCredentials"); 
      SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials); 

      QName qNameUsername = new QName("https://your.target.namespace/", "Username"); 
      SOAPHeaderElement username = header.addHeaderElement(qNameUsername); 
      username.addTextNode(this.username); 
      QName qNamePassword = new QName("https://your.target.namespace/", "Password"); 
      SOAPHeaderElement password = header.addHeaderElement(qNamePassword); 
      password.addTextNode(this.password); 

      userCredentials.addChildElement(username); 
      userCredentials.addChildElement(password); 

      message.saveChanges(); 
      //TODO: remove this writer when the testing is finished 
      StringWriter writer = new StringWriter(); 
      message.writeTo(new StringOutputStream(writer)); 
      LOGGER.debug("SOAP message: \n" + writer.toString()); 
     } catch (SOAPException e) { 
      LOGGER.error("Error occurred while adding credentials to SOAP header.", e); 
     } catch (IOException e) { 
      LOGGER.error("Error occurred while writing message to output stream.", e); 
     } 
     return true; 
    } 

    //TODO: remove this class after testing is finished 
    private static class StringOutputStream extends OutputStream { 

     private StringWriter writer; 

     public StringOutputStream(StringWriter writer) { 
      this.writer = writer; 
     } 

     @Override 
     public void write(int b) throws IOException { 
      writer.write(b); 
     } 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     LOGGER.debug("handleFault has been invoked."); 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
     LOGGER.debug("close has been invoked."); 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     LOGGER.debug("getHeaders has been invoked."); 
     return null; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

ध्यान दें कि मैं सिर्फ शीर्षक के साख को जोड़ने कर रहा हूँ और true लौटने। आप जो भी चाहते हैं वह पूरे संदेश के साथ करते हैं और false लौटाते हैं यदि कुछ ऐसा अपेक्षित है जो विफल हो जाता है।

मैं इस एक ग्राहक को लागू किया है:

<bean id="soapHandler" class="your.package.MyHandler"> 
    <property name="username" value="testUser"/> 
    <property name="password" value="testPassword"/> 
</bean> 

<jaxws:client "..."> 
    <jaxws:handlers> 
     <ref bean="soapHandler"/> 
    </jaxws:handlers> 
</jaxws:client> 

लेकिन यह भी endpoint पर लागू किया जा सकता है।

+0

हां यह javax.xml.ws.handler.soap पैकेज से आता है। मुझे नहीं पता कि यह जेएक्स-आरपीसी के साथ काम करेगा, मैंने केवल इसे जेएक्स-डब्ल्यूएस के साथ इस्तेमाल किया था। आपको यह देखना चाहिए कि यह काम करता है या नहीं :) –

+1

यह लिंक है जिसे आपको आईएबी के साथ जेएक्स-आरपीसी हैंडलर के बारे में पढ़ना चाहिए: http://www.ibm.com/developerworks/webservices/library/ws-tipjax2/index.html –

+0

यदि आपके पास हैंडलर है और आप उस हैंडलर में संदेश प्राप्त कर सकते हैं, तो इसका मतलब है कि आप संदेश में कुछ भी कर सकते हैं। आपको बस आरपीसी शैली के संदेश को संशोधित करने की आवश्यकता है। यहां उदाहरण दिए गए हैं कि यह जेएक्स-आरपीसी के माध्यम से कैसे किया जाता है: http://www.ibm.com/developerworks/xml/library/ws-tip-extend/index.html –

0

हम केवल साबुन संदेश से नहीं बल्कि लिफाफे से हेडर प्राप्त कर सकते हैं।

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