Java Axis安全标头

Java Axis安全标头,java,soap,header,axis2,soap-client,Java,Soap,Header,Axis2,Soap Client,Hi尝试在Java Axis2客户端程序中以的格式生成安全标头 <soapenv:Header> <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext> <wsse:UsernameToken> <wsse:Username>myUsername</wsse:Username> <wsse:Password>myPas

Hi尝试在Java Axis2客户端程序中以的格式生成安全标头

<soapenv:Header>
 <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext>
  <wsse:UsernameToken>
   <wsse:Username>myUsername</wsse:Username>
   <wsse:Password>myPassword</wsse:Password>
  </wsse:UsernameToken>
 </wsse:Security>
</soapenv:Header>
不幸的是,它没有产生我想要的东西,我得到了

<soapenv:Header>
 <wsse:Security soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
  <wsse:UsernameToken xmlns:wsse="">
   <wsse:Username xmlns:wsse="">myUsername</wsse:Username>
   <wsse:Password xmlns:wsse="">myPassword</wsse:Password>
  </wsse:UsernameToken>
 </wsse:Security>
</soapenv:Header>
如何生成SOAPHeader以不打印所有额外的空位?
干杯

您正在将一个空字符串作为第一个参数传递给MessageElement,并且需要传递
null
。请注意,
null
和空字符串(
“”
)在Java中不是一回事。此外,通过将名称空间前缀传递给MessageElement构造函数的本地名称(第二个)参数,您实际上是在作弊……这不是它的设计目的。也就是说,您可以通过传递
null
作为名称空间(第一个)参数来解决这个问题。如果您试图直接传递它,很可能会得到一个不明确的构造函数错误,因此请执行以下操作:

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
String nullString = null;
MessageElement usernameToken = new MessageElement(nullString, "wsse:UsernameToken");
MessageElement username = new MessageElement(nullString, "wsse:Username");
MessageElement password = new MessageElement(nullString, "wsse:Password");
username.setObjectValue(myProps.getProperty("username"));
usernameToken.addChild(username);
password.setObjectValue(myProps.getProperty("password"));
usernameToken.addChild(password);
wsseSecurity.addChild(usernameToken);

BookingPort bp = bsl.getBooking();
((Stub) bp).setHeader(wsseSecurity);

如果您对此有任何选择,我还建议您使用不同的web服务引擎(而不是Axis2)。

尝试使用Axis 1创建自定义标头。*(上述代码与Axis2不同)

import org.apache.axis.message.SOAPHeaderElement;
导入javax.xml.soap.SOAPElement;
public void createCustomHeader(){
SOAPElement-Oheaderlement;
皂素;
oHeaderElement=新的SOAPHeaderElement(“http://ws.mycompany.com“,“securityHeader”);
oHeaderElement.setPrefix(“sec”);
oHeaderElement.setMustUnderstand(false);
oElement=oHeaderElement.addChildElement(“用户名”);
oElement.addTextNode(“myusername”);
oElement=oHeaderElement.addChildElement(“密码”);
oElement.addTextNode(“mypassword”);
//您可以创建类似这样的客户端代码。。
mySampleServiceLocator服务=新的mySampleServiceLocator();
setMySampleServiceEndpointAddress(“endpointURL”);
MySampleWebService serv=service.getMySampleService();
MySampleServiceSoapBindingStub=(MySampleServiceSoapBindingStub)服务;
//将此标题添加到存根中
短管集管(oHeaderElement);
//最后调用您的web服务methid
服务getMyClaimStatus(“XYZ001”);
}
//它创建自定义标题,如下所示:
我的用户名
我的密码

如何在服务中使用soap头..请向我提供示例代码…java和axis2 1.6.7
faultDetail:
        {http://xml.apache.org/axis/}stackTrace:com.ctc.wstx.exc.WstxParsingException: Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) in XML 1.0 documents
 at [row,col {unknown-source}]: [1,450]
SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
String nullString = null;
MessageElement usernameToken = new MessageElement(nullString, "wsse:UsernameToken");
MessageElement username = new MessageElement(nullString, "wsse:Username");
MessageElement password = new MessageElement(nullString, "wsse:Password");
username.setObjectValue(myProps.getProperty("username"));
usernameToken.addChild(username);
password.setObjectValue(myProps.getProperty("password"));
usernameToken.addChild(password);
wsseSecurity.addChild(usernameToken);

BookingPort bp = bsl.getBooking();
((Stub) bp).setHeader(wsseSecurity);
import org.apache.axis.message.SOAPHeaderElement;
import javax.xml.soap.SOAPElement;


public void createCustomHeader(){

SOAPElement oHeaderElement;
SOAPElement oElement;   

    oHeaderElement = new SOAPHeaderElement("http://ws.mycompany.com", "securityHeader");
    oHeaderElement.setPrefix("sec");
    oHeaderElement.setMustUnderstand(false);

    oElement = oHeaderElement.addChildElement("username");
    oElement.addTextNode("myusername");
    oElement = oHeaderElement.addChildElement("password");
    oElement.addTextNode("mypassword");

    // You can create client code something like this..
    MySampleServiceServiceLocator service  = new MySampleServiceServiceLocator();
    service.setMySampleServiceEndpointAddress("endpointURL");
    MySampleWebService serv = service.getMySampleService();
    MySampleServiceSoapBindingStub stub = (MySampleServiceSoapBindingStub)serv;

    // add this header to your stubs
stub.setHeader(oHeaderElement);


// Finally call your web service methid
serv.getMyClaimStatus("XYZ001");


}

//It creates the custom header like this:

<soapenv:Header>
    <sec:securityHeader xmlns:sec="http://ws.mycompany.com"
        soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0">
        <sec:username>myusername</sec:username>
        <sec:password>mypassword</sec:password>
    </sec:securityHeader>
</soapenv:Header>