mrb*_*ela 2 java ws-security soap axis2 rampart
我正在尝试连接到现有的 SOAP Web 服务。我提供了一个 wsdl,从中我通过 Apache Axis2 XMLBeans 创建了 Java 类。
但是现在我必须使用 WS-Security-Header 扩展我自己编写的客户端发送的消息。我怎样才能做到这一点?
我为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类创建的消息,并使用此类标头。我只能找到为服务建立 WS 安全性的机会(在 webapp 文件夹等中)。
我对你的回答感到兴奋!
感谢您的帮助!
我解决了我的问题。我想与您分享我的解决方案,希望任何人都需要它!
正如我上面所说,我已经使用 Apache Axis2 XMLBeans ( http://axis.apache.org/axis2/java/core/docs/quickstartguide.html#clientxmlbeans )从 wsdl 文件中创建了 Java 类。
之后,我需要添加一个 WS 安全标头,它应该如下所示:
<wsse:Security soap: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-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username><YOUR USERNAME></wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"><YOUR PASSWORD></wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
我以编程方式解决了这个问题:
在存根中有 SOAP 方法(一种没有回调处理程序,一种带有 callbackHandler),您希望调用它来使用 Web 服务。在此方法中包含一个名为 的变量_messageContext。您可以从此处访问标头:_messageContext.getEnvelope().getHeader()返回 SOAPHeader 实例。通过这个实例,我addSecurityToHeader从类中调用方法HeaderAddery:
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
public class HeaderAdder {
public static void addSecurityToHeader(
org.apache.axiom.soap.SOAPHeader header) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace namespaceWSSE = factory
.createOMNamespace(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"wsse");
OMElement element = factory.createOMElement("Security", namespaceWSSE);
OMAttribute attribute = factory.createOMAttribute("mustUnderstand",
null, "1");
element.addAttribute(attribute);
header.addChild(element);
OMElement element2 = factory.createOMElement("UsernameToken",
namespaceWSSE);
OMNamespace namespaceWSU = factory
.createOMNamespace(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
"wsu");
attribute = factory.createOMAttribute("Id", namespaceWSU,
"UsernameToken-1");
element2.addAttribute(attribute);
element.addChild(element2);
OMElement element3 = factory.createOMElement("Username", namespaceWSSE);
element3.setText("<YOUR USERNAME>");
OMElement element4 = factory.createOMElement("Password", namespaceWSSE);
attribute = factory
.createOMAttribute(
"Type",
null,
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
element4.setText("<YOUR PASSWORD>");
element2.addChild(element3);
element2.addChild(element4);
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,认证工作了,我再也没有拒绝回应了。
如果您对此有任何疑问,请告诉我!
亲切的问候!
| 归档时间: |
|
| 查看次数: |
6707 次 |
| 最近记录: |