Web services 如何根据下面的web服务客户端迭代所有子元素SOAP头

Web services 如何根据下面的web服务客户端迭代所有子元素SOAP头,web-services,soap-client,ws-security,soapheader,java-ws,Web Services,Soap Client,Ws Security,Soapheader,Java Ws,基本上,我正在尝试按照下面的文章链接编写JAX-WS服务端代码 web服务客户端handleMessage中的代码(完整代码位于中) SOAPElement usernameToken=security.addChildElement(“usernameToken”,“wsse”); usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-ws

基本上,我正在尝试按照下面的文章链接编写JAX-WS服务端代码

web服务客户端handleMessage中的代码(完整代码位于中)

SOAPElement usernameToken=security.addChildElement(“usernameToken”,“wsse”);
usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement用户名=usernameToken.addChildElement(“用户名”,“wsse”);
username.addTextNode(“TestUser”);
SOAPElement password=usernameToken.addChildElement(“密码”、“wsse”);
password.setAttribute(“类型”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
addTextNode(“TestPassword”)```
现在,如何为下面输入的soap xml编写相关的服务器端代码
测试用户
测试密码

我能够编写服务器端处理程序代码,用于验证OASIS、PFB handlerMessage(.)方法的WebService-Security头

输入XML

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
     <wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">                              
          <wsse:usernametoken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">                              
               <wsse:username >TestUser</wsse:username>
               <wsse:password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPassword</wsse:password>
          </wsse:usernametoken>
     </wsse:security>
</SOAP-ENV:Header>
   <S:Body>
      <ns2:getAreaDeatilsByPinCode xmlns:ns2="http://contract.webservice.room/">
         <arg0>12</arg0>
      </ns2:getAreaDeatilsByPinCode>
   </S:Body>
</S:Envelope>


测试用户
测试密码
12
@覆盖
公共布尔handleMessage(SOAPMessageContext SOAPMessageContext){
//WS-Security-Publisher-OASIS,命名空间URI
最后一个字符串WSSE_NS_URI=”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
//带有标题元素的限定符
最终QName QName_WSSE_USERNAMETOKEN=新QName(WSSE_NS_URI,“USERNAMETOKEN”);
最终QName QName_WSSE_USERNAME=新QName(WSSE_NS_URI,“用户名”);
最终QName QName_WSSE_PASSWORD=新QName(WSSE_NS_URI,“密码”);
字符串wsseUsername=null;
字符串wssePassword=null;
System.out.println(“用于“+MessageContext.MESSAGE\u OUTBOUND\u属性的处理程序触发器”);
布尔值isRequest=(布尔值)soapMessageContext.get(MessageContext.MESSAGE\u出站\u属性);
如果(!isRequest){
试一试{
SOAPHeader header=soapMessageContext.getMessage().getSOAPHeader();
if(头==null){
header=soapMessageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
GeneratesAperMessage(soapMessageContext.getMessage(),“无SOA头”);
}
//从SOAP头获取客户端数据
迭代器headerElements=header.CheckeallheaderElements();
while(headerElements.hasNext()){
SOAPHeaderElement headerElement=(SOAPHeaderElement)headerElements.next();
if(headerElement.getElementName().getLocalName().equals(“安全”)){
System.out.println(“内部安全”);
SOAPHeaderElement安全元素=headerElement;
迭代器securityChildern=securityElement.getChildElements();
while(securityChildern.hasNext()){
System.out.println(“内部安全文档”);
Node Node=(Node)securityChildern.next();
if(SOAPElement的节点实例){
System.out.println(“输入节点…”);
SOAPElement=(SOAPElement)节点;
QName elementQname=element.getElementQName();
if(QNAME_WSSE_USERNAMETOKEN.equals(elementQname)){
System.out.println(“验证用户名和密码…”);
SOAPElement usernameTokenElement=元素;
wsseUsername=getFirstChildElementValue(usernameTokenElement,QNAME\u WSSE\u USERNAME);
wssePassword=getFirstChildElementValue(usernameTokenElement,QNAME\u WSSE\u密码);
如果(!wsseUsername.equals(“TestUser”)| |!wssePassword.equals(“TestPassword”)){
生成密码消息(soapMessageContext.getMessage(),“用户名和密码错误…”);
}
System.out.println(“用户名:“+wsseUsername+”,密码:“+wssePassword”);
打破
}
}
}
if(wsseUsername!=null){
打破
}
}
}
}捕获(SOAPE例外){
e、 printStackTrace();
}
}
返回true;
}
私有字符串getFirstChildElementValue(SOAPElement用户名TokenElement、QName QName\u WSSE\u用户名){
System.out.println(“获取用户名和密码”);
字符串值=null;
迭代器usernameTokeChildren=usernameTokenElement.getChildElements(qNAME\u WSSE\u USERNAME);
while(usernameTokeChildren.hasNext()){
System.out.println(“获取用户名和密码的子元素”);
SOAPElement childElement=(SOAPElement)UsernameTokeChilderen.next();
value=childElement.getValue();
}
返回值;
}
private void GeneratesApperMessage(SOAPMessage消息,字符串原因){
试一试{
SOAPBody faultBody=message.getSOAPPart().getEnvelope().getBody();
SOAPFault SOAPFault=faultBody.addFault();
setFaultString(原因);
抛出新的SOAPFaultException(soapFault);
}捕获(SOAPE例外){
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
     <wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">                              
          <wsse:usernametoken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">                              
               <wsse:username >TestUser</wsse:username>
               <wsse:password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPassword</wsse:password>
          </wsse:usernametoken>
     </wsse:security>
</SOAP-ENV:Header>
   <S:Body>
      <ns2:getAreaDeatilsByPinCode xmlns:ns2="http://contract.webservice.room/">
         <arg0>12</arg0>
      </ns2:getAreaDeatilsByPinCode>
   </S:Body>
</S:Envelope>

@Override
    public boolean handleMessage(SOAPMessageContext soapMessageContext) {

        // WS-Security - Publisher - OASIS,  Namespace URI 
        final String WSSE_NS_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
        // Qualifier with header elements 
        final QName QNAME_WSSE_USERNAMETOKEN = new QName(WSSE_NS_URI, "usernametoken");
        final QName QNAME_WSSE_USERNAME = new QName(WSSE_NS_URI, "username");
        final QName QNAME_WSSE_PASSWORD = new QName(WSSE_NS_URI, "password");

        String wsseUsername = null;
        String wssePassword = null;

        System.out.println("Handler trigger for " + MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        Boolean isRequest = (Boolean) soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (!isRequest) {
            try {

                SOAPHeader header = soapMessageContext.getMessage().getSOAPHeader();
                if (header == null) {
                    header = soapMessageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
                    generateSOAPErrMessage(soapMessageContext.getMessage(), "No SOA Header");
                }
                // Get client data from SOAP headers
                Iterator<?> headerElements = header.examineAllHeaderElements();
                while (headerElements.hasNext()) {
                    SOAPHeaderElement headerElement = (SOAPHeaderElement) headerElements.next();
                    if (headerElement.getElementName().getLocalName().equals("security")) {
                        System.out.println("inside security");
                        SOAPHeaderElement securityElement = headerElement;
                        Iterator<?> securityChildern = securityElement.getChildElements();
                        while (securityChildern.hasNext()) {
                            System.out.println("inside securityChildern");
                            Node node = (Node) securityChildern.next();
                            if (node instanceof SOAPElement) {
                                System.out.println("insdie node...");
                                SOAPElement element = (SOAPElement) node;
                                QName elementQname = element.getElementQName();
                                if (QNAME_WSSE_USERNAMETOKEN.equals(elementQname)) {

                                    System.out.println("validating username and password...");
                                    SOAPElement usernameTokenElement = element;
                                    wsseUsername = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_USERNAME);
                                    wssePassword = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_PASSWORD);
                                    if(!wsseUsername.equals("TestUser") || !wssePassword.equals("TestPassword")){
                                        generateSOAPErrMessage(soapMessageContext.getMessage(), "username and password are wrong....");
                                    }
                                    System.out.println("username::"+wsseUsername+ " , password::"+wssePassword);
                                    break;
                                }
                            }
                        }
                        if (wsseUsername != null) {
                            break;
                        }
                    }
                }

            } catch (SOAPException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    private String getFirstChildElementValue(SOAPElement usernameTokenElement, QName qNAME_WSSE_USERNAME) {

        System.out.println("get username and password");
        String value = null;
        Iterator<?> usernameTokenChilderen = usernameTokenElement.getChildElements(qNAME_WSSE_USERNAME);

        while (usernameTokenChilderen.hasNext()) {
            System.out.println("get the child elment for username and password");
            SOAPElement childElement = (SOAPElement) usernameTokenChilderen.next();
            value = childElement.getValue();
        }

        return value;
    }

    private void generateSOAPErrMessage(SOAPMessage message, String cause) {

        try {
            SOAPBody faultBody = message.getSOAPPart().getEnvelope().getBody();

            SOAPFault soapFault = faultBody.addFault();
            soapFault.setFaultString(cause);
            throw new SOAPFaultException(soapFault);

        } catch (SOAPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <ns2:getAreaDeatilsByPinCodeResponse xmlns:ns2="http://contract.webservice.room/">
             <return>
                <areaName>XXXXX</areaName>
                <location>XXXXX</location>
                <pincode>12</pincode>
                <state>XX</state>
             </return>
          </ns2:getAreaDeatilsByPinCodeResponse>
       </S:Body>
    </S:Envelope>

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>username and password are wrong....</faultstring>
      </S:Fault>
   </S:Body>
</S:Envelope>