【问题标题】:Axis security headerAxis 安全标头
【发布时间】:2011-03-10 12:27:54
【问题描述】:

您好,尝试在 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>

使用以下代码

SOAPHeaderElement wsseSecurity = new SOAPHeaderElement(new PrefixedQName("http://schemas.xmlsoap.org/ws/2002/04/secext","Security", "wsse"));
MessageElement usernameToken = new MessageElement("", "wsse:UsernameToken");
MessageElement username = new MessageElement("", "wsse:Username");
MessageElement password = new MessageElement("", "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);

不幸的是,它并没有产生我想要的,我得到的。

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

另一端的服务似乎没有处理多余的位,导致错误

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]

如何生成 SOAPHeader 以不打印出所有额外的空位? 干杯

【问题讨论】:

  • 如何在服务中肥皂标题..请给我示例代码...java和axis2 1.6.7

标签: java soap header axis2 soap-client


【解决方案1】:

您将一个空字符串作为第一个参数传递给 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)。

【讨论】:

    【解决方案2】:

    尝试以这种方式使用 Axis 1.* 创建自定义标题(上面的代码与 Axis2 不同)

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2015-11-05
      • 2014-02-11
      • 2016-03-24
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多