2012-09-05 8 views
5

Potrzebuję włączyć nagłówek uwierzytelniania (tj. Jako część żądania nagłówka SOAP) w mojej nowej usłudze internetowej. Ten nagłówek uwierzytelniania zweryfikuje szczegóły userId i password. Muszę zweryfikować zawartość szczegółów nagłówka żądania dla uwierzytelnienia w mojej Web Service. Po uwierzytelnieniu treść SOAP żądania zostanie przetworzona, w przeciwnym razie wiadomość o nieprawidłowym uwierzytelnieniu zostanie odesłana przez usługę WWW do aplikacji klienckiej wywołującej usługę.Dodawanie elementów w protokole SOAP Żądanie nagłówka do uwierzytelniania

Nie jestem w stanie zrozumieć, jak utworzyć usługę WWW, w której nagłówek SOAP będzie zawierał niektóre elementy (w moim przypadku elementy uwierzytelniające, takie jak userId i hasło).

Zwykle jakakolwiek metoda ujawniona w usłudze pojawi się jako część treści SOAP. Dlatego nie można pomylić sposobu dodawania elementów uwierzytelniania w nagłówku SOAP.

Proszę o pomoc

Pozdrowienia,

+0

Czy ktoś może na to spojrzeć? https://stackoverflow.com/questions/43002576/soap-header-xmlnsds-on-each-element-for-xml-signature-generation –

Odpowiedz

4

Ostatnio ja napisałem klasę, która dodaje poświadczenia użytkownika do SOAP cel. Aby to zrobić, musisz utworzyć klasę, która implementuje interfejs SOAPHandler<SOAPMessageContext>. Dla np .:

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

Zauważ, że jestem po prostu dodanie referencji do nagłówka i powrocie true. Robisz, co chcesz, całą wiadomością i zwracasz false, jeśli coś, czego oczekuje się, nie powiedzie się.

I wprowadziły to można kliencie:

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

Ale to też może być realizowane na endpoint.

+0

Tak, pochodzi z pakietu javax.xml.ws.handler.soap. Nie wiem, czy będzie działać z JAX-RPC, użyłem go tylko z JAX-WS. Powinieneś sprawdzić, czy to działa :) –

+1

Oto link, który powinieneś przeczytać o programie obsługi JAX-RPC z IBM: http://www.ibm.com/developerworks/webservices/library/ws-tipjax2/index.html –

+0

Jeśli masz program obsługi i możesz odebrać wiadomość do tego programu obsługi, oznacza to, że możesz zrobić cokolwiek dla wiadomości. Po prostu potrzebujesz dowiedzieć się, jak zmodyfikować komunikat stylu RPC. Oto przykłady, jak to zrobić za pomocą JAX-RPC: http://www.ibm.com/developerworks/xml/library/ws-tip-extend/index.html –

0

Możemy uzyskać nagłówek z koperty, ale nie z wiadomości mydlanej.

Powiązane problemy