2012-09-05 24 views
5

Tôi cần kết hợp tiêu đề xác thực (ví dụ như một phần của yêu cầu tiêu đề SOAP) trong dịch vụ web mới của tôi. Tiêu đề xác thực đó sẽ xác minh chi tiết userId và mật khẩu. Tôi phải xác minh nội dung chi tiết tiêu đề yêu cầu để xác thực trong Dịch vụ web của tôi. Nếu được xác thực, thì cơ thể SOAP của yêu cầu sẽ được xử lý, nếu không thông báo Xác thực Không hợp lệ sẽ được gửi lại bởi Dịch vụ Web đến ứng dụng khách sẽ gọi dịch vụ.Thêm các yếu tố trong yêu cầu Header SOAP để xác thực

Tôi không thể hiểu cách tạo dịch vụ web trong đó tiêu đề SOAP sẽ chứa một số phần tử (trong trường hợp của tôi, các phần tử xác thực như userId và mật khẩu).

Thông thường, bất kỳ phương pháp nào được hiển thị trong dịch vụ sẽ là một phần của Cơ thể SOAP. Do đó nhầm lẫn làm thế nào để tiến hành với việc thêm các phần tử xác thực trong tiêu đề SOAP.

Xin giúp

Kính trọng,

+0

Có ai có thể xem cái này không? https://stackoverflow.com/questions/43002576/soap-header-xmlnsds-on-each-element-for-xml-signature-generation –

Trả lời

4

Gần đây tôi đã viết một lớp mà thêm thông tin người dùng để SOAP tiêu đề. Để làm điều đó, bạn cần tạo một lớp thực hiện giao diện SOAPHandler<SOAPMessageContext>. Ví dụ:

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

Lưu ý rằng tôi chỉ thêm thông tin đăng nhập vào tiêu đề và trả lại true. Bạn làm những gì bạn muốn với toàn bộ thông báo và trả lại false nếu có điều gì đó được mong đợi không thành công.

tôi đã thực hiện điều này một client:

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

Nhưng nó cũng có thể được thực hiện trên endpoint.

+0

Có đến từ gói javax.xml.ws.handler.soap. Tôi không biết nếu nó sẽ làm việc với JAX-RPC, tôi chỉ sử dụng nó với JAX-WS. Bạn nên thử xem nó có hoạt động không :) –

+1

Đây là liên kết bạn nên đọc về trình xử lý JAX-RPC với IBM: http://www.ibm.com/developerworks/webservices/library/ws-tipjax2/index.html –

+0

Nếu bạn có một người xử lý và bạn có thể nhận được tin nhắn vào bộ xử lý đó, điều đó có nghĩa là bạn có thể làm bất cứ điều gì với thông điệp. Bạn chỉ cần tìm ra cách sửa đổi thông điệp phong cách RPC. Dưới đây là các ví dụ về cách thực hiện thông qua JAX-RPC: http://www.ibm.com/developerworks/xml/library/ws-tip-extend/index.html –

0

Chúng tôi có thể lấy tiêu đề từ phong bì chỉ từ thông điệp xà phòng.

Các vấn đề liên quan