【问题标题】:Adding ws-security to wsdl2java generated classes将 ws-security 添加到 wsdl2java 生成的类
【发布时间】:2012-12-25 07:56:57
【问题描述】:

我使用 CXF 的 wsdl2java 从 WSDL 生成了一堆客户端类。执行以下操作时如何将 WS-Security 添加到标头:

URL url = new URL("http://fqdn:8080/service/MessageHandler");
MessageHandlerService service = new MessageHandlerService(url);
MessageHandler handler = service.getMessageHandler();
MyMessage message = new MyMessage();
message.setSender("User 1");
handler.sendMessage(message);

我认为handler 是一个javax.xml.ws.Service 实例。

【问题讨论】:

    标签: java soap cxf ws-security


    【解决方案1】:

    通常是在代码之外完成的。

    在这种情况下THIS 可能会有所帮助

    如果你想以编程方式添加,

    以编程方式将 WS-Security UsernameToken 标头添加到 轴绑定,非标准,但对快速测试很有用。 (存根/绑定: 就是以_PortType结尾的类)

    /**
      * Adds WS-Security header with UsernameToken element to the Axis binding
      * @param binding
      * @param wsUser
      * @param wsPass
      * @throws SOAPException
      */
     protected static void addWsSecurityHeader(org.apache.axis.client.Stub binding, String wsUser, String wsPass)
       throws SOAPException {
    
      // Create the top-level WS-Security SOAP header XML name.
      QName headerName = new QName(
        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
      SOAPHeaderElement header = new SOAPHeaderElement(headerName);
      //  no intermediate actors are involved.
      header.setActor(null);
      // not important, "wsse" is standard
      header.setPrefix("wsse");
      header.setMustUnderstand(true);
    
      // Add the UsernameToken element to the WS-Security header
      SOAPElement utElem = header.addChildElement("UsernameToken");
      SOAPElement userNameElem = utElem.addChildElement("Username");
      userNameElem.setValue(wsUser);
      SOAPElement passwordElem = utElem.addChildElement("Password");
      passwordElem.setValue(wsPass);
    
      // Finally, attach the header to the binding.
      binding.setHeader(header);
     }
    

    【讨论】:

      【解决方案2】:
      <jaxws:client id="client"
          serviceClass="com.mycompany.TheServiceInterface"
          address="http://fqdn/service/Endpoint?wsdl">
          <jaxws:outInterceptors>
              <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
                  <constructor-arg>
                      <map>
                          <entry key="action" value="Timestamp UsernameToken"/>
                          <entry key="user" value="test.user"/>
                          <entry key="passwordType" value="PasswordNone"/>
                      </map>
                  </constructor-arg>
              </bean>
          </jaxws:outInterceptors>
      </jaxws:client>
      

      然后,如果您将客户端转换为 BindingProvider,您可以根据需要以编程方式更改端点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-24
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        相关资源
        最近更新 更多