Наконец-то у меня есть решение моей проблемы
Создайте обработчик 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.Ява
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();
}
}
}