用于安全肥皂的springboot客户端

时间:2018-09-20 08:29:58

标签: java spring-boot authentication soap wsdl

我正在尝试从springboot客户端访问安全的SOAP服务,但出现此错误

  

StartTransaction已开始...   Equifax |开始交易...   Equifax |服务初始化   Equifax | 2018-09-20 07:50:38.512信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{​​3}}} canadav3:http://eid.equifax.com/soap/schema/canada/v3/wsdl   Equifax | ServicePort发起人   Equifax | 2018-09-20 07:50:39.558信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{​​3}}} canadav3:https://eid.equifax.ca/uru/soap/ut/canadav3?wsdl   Equifax | 2018-09-20 07:50:39.614信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{​​3}}} canadav3:http://eid.equifax.com/soap/schema/canada/v3/wsdl   Equifax | org.apache.cxf.binding.soap.SoapFault:发现错误处理标头   Equifax |发现处理标头时发生错误

我的代码:

@ResponseBody
public ResponseEntity<Object> startTransaction(@RequestBody Identity identity) {
    System.out.println("StartTransaction Started...");
    InitialRequest initialRequest = new InitialRequest();
    ProcessingOptions value = new ProcessingOptions();
    value.setLanguage("French");

    initialRequest.setIdentity(identity);
    initialRequest.setProcessingOptions(value);
    InitialResponse iR = new InitialResponse();
    try {
        System.out.println("Start transaction ...");
        Canadav3 canada = new Canadav3();
        System.out.println("Service initialise");
        CanadaPortTypeV3 c = canada.getCanadaHttpPortV3();
        System.out.println("ServicePort initiee");

        URL wsdlURL = new URL("https://eid.equifax.ca/uru/soap/ut/canadav3?wsdl");
        QName qname = new QName("http://eid.equifax.com/soap/schema/canada/v3/wsdl", "Canadav3");
        Service service =Service.create(wsdlURL, qname);
        c = (CanadaPortTypeV3)service.getPort(CanadaPortTypeV3.class);

        BindingProvider bp = (BindingProvider)c;
        bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "/user");
        bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");

        iR = c.startTransaction(initialRequest);
        System.out.println("Finish");
        return ResponseEntity.status(HttpStatus.OK).body(iR);
    }catch (CredentialsErrorFault c) {
        System.err.println("Finish");
        System.err.println("CredentialsErrorFault "+c.getLocalizedMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert(c.getMessage()));
    }
    catch(ValidationErrorFault e) {
        System.err.println("Finish");
        System.err.println("ValidationErrorFault "+e.getLocalizedMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert(e.getMessage()));
    }
    catch(Exception e) {
        System.out.println(e.getCause());
        System.err.println(e.getMessage());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert("Error unknows"));
    }
}

先谢谢您

1 个答案:

答案 0 :(得分:0)

我终于可以解决我的问题了

创建一个SOAP处理程序,以将每条传出SOAP消息的客户端身份验证信息注入SOAP头块。

import java.io.ByteArrayOutputStream;
import java.util.Set;
import java.util.logging.Logger;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
    private static Logger logger = Logger.getLogger(SOAPLoggingHandler.class.getName());

    public boolean handleMessage(SOAPMessageContext context) {
                Boolean outGoingMsg = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
                 SOAPMessage soapMsg = context.getMessage();


 if(soapMsg != null && soapMsg.getSOAPPart() != null) {

        SOAPEnvelope soapEnv;

try {
    soapEnv = soapMsg.getSOAPPart().getEnvelope();
    SOAPHeader soapHeader = soapEnv.getHeader();
    if (soapHeader == null) {
        soapHeader = soapEnv.addHeader();
    }

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

if (outGoingMsg)
      System.out.println("########outgoing soap message######");
  else
      System.out.println("########incoming soap message############");

      logSoapMessage(context);     

  return true;      
}

public boolean handleFault(SOAPMessageContext context) {

    System.out.println("########Fault soap message######");
     logSoapMessage(context);

return true;      
}

public void close(MessageContext context) {

}

public void logSoapMessage(SOAPMessageContext context) {

 try {
     SOAPMessage msg = context.getMessage();

     ByteArrayOutputStream bas = new ByteArrayOutputStream();
     msg.writeTo(bas);
     System.out.println(bas);
 }
 catch (Exception e) {
    System.out.println("Error while writing SOAP message to debug log " + e);
 }
}

public Set<QName> getHeaders() {
 return null;  
}
private void addAuthentication(SOAPHeader header) {
 try {
                       SOAPElement security =header.addChildElement("Security", "wsse", "http://docs.oasis- open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                       SOAPElement usernameToken =
            security.addChildElement("UsernameToken", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
    SOAPElement username = usernameToken.addChildElement("Username", "wsse");
    username.addTextNode("/yourusername");

SOAPElement password =
            usernameToken.addChildElement("Password", "wsse");
    password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
    password.addTextNode("yourpassword");

} catch (Exception e) {
    e.printStackTrace();
}

}
}

然后我在拨打肥皂服务时使用它 就像这里一样( 示例:SOAPLoggingHandler.java )=> https://www.juniper.net/documentation/en_US/junos-space16.1/topics/task/operational/junos-space-servicenow-tt-web-service-client-setting.html

示例– SOAPLoggingHandler.java

import java.io.ByteArrayOutputStream;
import java.util.Set;
import java.util.logging.Logger;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;


public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
          private static Logger logger = Logger.getLogger(SOAPLoggingHandler.class.getName());

           public boolean handleMessage(SOAPMessageContext context) {
                       Boolean outGoingMsg = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
                        SOAPMessage soapMsg = context.getMessage();


        if(soapMsg != null && soapMsg.getSOAPPart() != null) {

            SOAPEnvelope soapEnv;

try {
        soapEnv = soapMsg.getSOAPPart().getEnvelope();
        SOAPHeader soapHeader = soapEnv.getHeader();
        if (soapHeader == null) {
                soapHeader = soapEnv.addHeader();
            }

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

if (outGoingMsg)
             System.out.println("########outgoing soap message######");
         else
             System.out.println("########incoming soap message############");

             logSoapMessage(context);     

         return true;      
    }

    public boolean handleFault(SOAPMessageContext context) {

        System.out.println("########Fault soap message######");
            logSoapMessage(context);

return true;      
    }

    public void close(MessageContext context) {

    }

    public void logSoapMessage(SOAPMessageContext context) {

        try {
            SOAPMessage msg = context.getMessage();

            ByteArrayOutputStream bas = new ByteArrayOutputStream();
            msg.writeTo(bas);
            System.out.println(bas);
        }
        catch (Exception e) {
            System.out.println("Error while writing SOAP message to debug log " + e);
        }
    }

public Set<QName> getHeaders() {
        return null;  
    }
    private void addAuthentication(SOAPHeader header) {
        try {

                              SOAPElement security =
                                                      header.addChildElement("Security", "wsse", "http://docs.oasis- open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

                               SOAPElement usernameToken =
                   security.addChildElement("UsernameToken", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");


           SOAPElement username =
                   usernameToken.addChildElement("Username", "wsse");
           username.addTextNode("***");

SOAPElement password =
                   usernameToken.addChildElement("Password", "wsse");
           password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
           password.addTextNode("***");

       } catch (Exception e) {
           e.printStackTrace();
       }

    }
}