2011-05-12 80 views
13

我有一个来自oracle的NO-.net webservice 要访问,我需要添加肥皂标题。我怎样才能在java中添加肥皂头?如何在java中添加肥皂标题

Authenticator.setDefault(new ProxyAuthenticator("username", "password")); 
       System.getProperties().put("proxySet", "true"); 
       System.setProperty("http.proxyHost", "IP"); 
       System.setProperty("http.proxyPort", "port"); 




       proxy = new RegPresMed_Service(new URL("webservice")).getRegPresMed(); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "realwebservice"); 
       ((BindingProvider) proxy).getRequestContext().put("com.sun.xml.ws.request.timeout", new Integer(60000)); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername"); 
       ((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword"); 

这是必要的吗?

((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername"); 
        ((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword"); 

我的肥皂头是这样的:

<wsse:Security soapenv:mustUnderstand="1" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-6" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:Username>username</wsse:Username> 
     <wsse:Password 
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password> 
     <wsse:Nonce 
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">randomnaumber==</wsse:Nonce> 
     <wsu:Created>dateCreated</wsu:Created> 
    </wsse:UsernameToken> 
</wsse:Security> 

回答

18
+1

有用的链接。谢谢。 – Abdul 2012-02-16 06:01:38

+0

您好我也使用过这个示例,但在添加以下行时出现错误:usernameToken.addAttribute(QName.valueOf(“xmlns:wsu”),urlUtility);这是错误org.w3c.dom.DOMException :NAMESPACE_ERR:试图以对名称空间不正确的方式创建或更改对象。我已经尝试过任何事情,只要我的技能去请求需要帮助 – Alex 2012-10-22 13:45:02

+0

现在链接已经死了。更换? – MeIr 2013-09-17 17:35:08

2

我面临同样的问题,并通过删除的xmlns解决它:WSU属性不要在usernameToken.Hope中添加它,这也解决了你的问题。

3

我努力得到这个工作。这就是为什么我会在这里添加一个完整的解决方案:

我的目标是将这一头添加到SOAP信封:

<soapenv:Header> 
     <urn:OTAuthentication> 
     <urn:AuthenticationToken>TOKEN</urn:AuthenticationToken> 
     </urn:OTAuthentication> 
    </soapenv:Header> 
  1. 首先创建一个SOAPHeaderHandler类。

    import java.util.Set; 
    import java.util.TreeSet; 
    
    import javax.xml.namespace.QName; 
    import javax.xml.soap.SOAPElement; 
    import javax.xml.soap.SOAPEnvelope; 
    import javax.xml.soap.SOAPFactory; 
    import javax.xml.soap.SOAPHeader; 
    import javax.xml.ws.handler.MessageContext; 
    import javax.xml.ws.handler.soap.SOAPHandler; 
    import javax.xml.ws.handler.soap.SOAPMessageContext; 
    
    public class SOAPHeaderHandler implements SOAPHandler<SOAPMessageContext> { 
    
        private final String authenticatedToken; 
    
        public SOAPHeaderHandler(String authenticatedToken) { 
         this.authenticatedToken = authenticatedToken; 
        } 
    
        public boolean handleMessage(SOAPMessageContext context) { 
         Boolean outboundProperty = 
           (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
         if (outboundProperty.booleanValue()) { 
          try { 
           SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope(); 
           SOAPFactory factory = SOAPFactory.newInstance(); 
           String prefix = "urn"; 
           String uri = "urn:api.ecm.opentext.com"; 
           SOAPElement securityElem = 
             factory.createElement("OTAuthentication", prefix, uri); 
           SOAPElement tokenElem = 
             factory.createElement("AuthenticationToken", prefix, uri); 
           tokenElem.addTextNode(authenticatedToken); 
           securityElem.addChildElement(tokenElem); 
           SOAPHeader header = envelope.addHeader(); 
           header.addChildElement(securityElem); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } else { 
          // inbound 
         } 
         return true; 
        } 
    
        public Set<QName> getHeaders() { 
         return new TreeSet(); 
        } 
    
        public boolean handleFault(SOAPMessageContext context) { 
         return false; 
        } 
    
        public void close(MessageContext context) { 
         // 
        } 
    } 
    
  2. 添加处理程序到代理服务器。请注意,根据javax.xml.ws.Binding的文档:“如果返回的链被修改,则需要调用setHandlerChain以使用新链配置绑定实例。”

Authentication_Service authentication_Service = new Authentication_Service();

Authentication basicHttpBindingAuthentication = authentication_Service.getBasicHttpBindingAuthentication(); String authenticatedToken = "TOKEN"; List<Handler> handlerChain = ((BindingProvider)basicHttpBindingAuthentication).getBinding().getHandlerChain(); handlerChain.add(new SOAPHeaderHandler(authenticatedToken)); ((BindingProvider)basicHttpBindingAuthentication).getBinding().setHandlerChain(handlerChain);
+0

我有非常类似的目标,将auth令牌添加到SOAP连接头中。我遵循相同的代码,但我得到“SOAPFaultException:OTDS用户名和密码是必需的。”异常,即使我已经通过有效的身份验证令牌。你能指导我我哪里错了? (我可以在独立的Java应用程序中与OT连接,但不能在我作为web服务运行时连接) – Tony 2017-03-14 14:51:24

+1

尝试查看您作为SOAP封装发送的内容。你可以通过添加一个处理程序来完成。按照这篇文章中的答案http://stackoverflow.com/questions/1945618/tracing-xml-request-responses-with-jax-ws – edubriguenti 2017-03-14 15:03:41

+0

通过添加处理程序,完整的SOAP信封将打印在日志中,而你会看到什么是错的。 – edubriguenti 2017-03-14 15:04:15

0

Maven的依赖

<dependency> 
     <groupId>org.springframework.ws</groupId> 
     <artifactId>spring-ws-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.ws.security</groupId> 
     <artifactId>wss4j</artifactId> 
     <version>1.6.19</version> 
    </dependency>  

配置类

import org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor; 

@Configuration 
public class ConfigurationClass{ 

@Bean 
public Wss4jSecurityInterceptor securityInterceptor() { 
    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor(); 
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken"); 
    wss4jSecurityInterceptor.setSecurementMustUnderstand(true); 
    wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText"); 
    wss4jSecurityInterceptor.setSecurementUsername("123456789011"); 
    wss4jSecurityInterceptor.setSecurementPassword("TestPass123"); 
    return wss4jSecurityInterceptor; 
} 

结果XML

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Header> 
    <wsse:Security 
     xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
     xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
     SOAP-ENV:mustUnderstand="1"> 
     <wsse:UsernameToken wsu:Id="UsernameToken-F57F40DC89CD6998E214700450735811"> 
      <wsse:Username>123456789011</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPass123</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    ... 
    something 
    ... 
</SOAP-ENV:Body>