- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个实现 SOAPHandler interface 的类. handleMessage 定义为:
public boolean handleMessage(SOAPMessageContext context) {
SOAPMessage msg = context.getMessage();
SOAPPart part = msg.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
// add namespaces
SOAPElement envelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-
// add the header with additional elements
Name qname = envelope.createName("Security", "sse", "http://example.com/security.xsd");
element = envelope.addHeader().addChildElement(qname);
qname = envelope.createName("mustUnderstand");
element.addAttribute(qname, "1");
qname = envelope.createName("UsernameToken", "sse", "http://example.com/user.xsd");
element = envelope.getHeader().addHeaderElement(qname);
element.addTextNode("user1");
qname = envelope.createName("Password");
element = envelope.getHeader().addHeaderElement(qname);
element.addTextNode("1234");
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
这会生成以下消息:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<S:Header>
<sse:Security xmlns:sse="http://example.com/security.xsd" mustUnderstand="1"/>
<sse:UsernameToken xmlns:sse="http://example.com/user.xsd">user1</sse:UsernameToken>
</S:Header>
<S:Body>
....The rest of the transaction
</S:Body>
</S:Envelope>
问题是我需要生成具有以下格式的消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<sse:Security soapenv:mustUnderstand="1" xmlns:sse="http://example.com/security.xsd">
<sse:UsernameToken wsu:Id="UsernameToken-9993341" xmlns:wsu="http://example.com/user.xsd">
<sse:Username>user1</sse:Username>
<sse:Password Type="http://example.com/password#PasswordText">1234</sse:Password>
</sse:UsernameToken>
</sse:Security>
</soapenv:Header>
<soapenv:Body>
....The rest of the transaction
</soapenv:Body>
</soapenv:Envelope>
“mustUnderstand”属性没有 soapenv 前缀,sse:Security 标签立即关闭而不是将其他标签作为子标签,并且 UserName 的格式不正确
<sse:Username>user1</sse:Username>
.如何使用 SOAPElement 正确格式化消息方法?我需要知道的最重要的事情是如何正确地在安全标签内放置标签,以及如何正确格式化用户名/密码标签。
我已经尝试了 addHeaderElement 和 addChildElement 方法的不同组合,但我无法正确格式化它,而且 javadocs 没有提供关于它们将生成什么的足够详细信息。
最佳答案
这是从我的工作处理程序中获取的。希望它对你有用。
public static final String WSSE_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
public static final String PASSWORD_TEXT_TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
public static final String WSSE_SECURITY_LNAME = "Security";
public static final String WSSE_NS_PREFIX = "wsse";
private String username;
private String password;
private boolean mustUnderstand = false;
public boolean handleMessage(SOAPMessageContext messageContext) {
Object bOutbound = messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (bOutbound == Boolean.TRUE) {
try {
if (username != null && username.length() != 0) {
addSecurityHeader(messageContext);
LOG.debug("Added security header");
} else {
LOG.debug("No username configured thus not adding a security header");
}
} catch (Exception e) {
LOG.error("Exception in handleMessage", e);
return false;
}
}
return true;
}
private void addSecurityHeader(SOAPMessageContext messageContext) throws SOAPException {
SOAPFactory sf = SOAPFactory.newInstance();
SOAPHeader header = messageContext.getMessage().getSOAPPart().getEnvelope().getHeader();
if (header == null) {
header = messageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
}
Name securityName = sf.createName(WSSE_SECURITY_LNAME, WSSE_NS_PREFIX, WSSE_NS);
SOAPHeaderElement securityElem = header.addHeaderElement(securityName);
securityElem.setMustUnderstand(mustUnderstand);
Name usernameTokenName = sf.createName("UsernameToken", WSSE_NS_PREFIX, WSSE_NS);
SOAPElement usernameTokenMsgElem = sf.createElement(usernameTokenName);
Name usernameName = sf.createName("Username", WSSE_NS_PREFIX, WSSE_NS);
SOAPElement usernameMsgElem = sf.createElement(usernameName);
usernameMsgElem.addTextNode(username);
usernameTokenMsgElem.addChildElement(usernameMsgElem);
Name passwordName = sf.createName("Type", WSSE_NS_PREFIX, WSSE_NS);
SOAPElement passwordMsgElem = sf.createElement("Password", WSSE_NS_PREFIX, WSSE_NS);
passwordMsgElem.addAttribute(passwordName, PASSWORD_TEXT_TYPE);
passwordMsgElem.addTextNode(password);
usernameTokenMsgElem.addChildElement(passwordMsgElem);
securityElem.addChildElement(usernameTokenMsgElem);
}
关于java - 如何使用自定义 SOAPHandler 正确格式化 SOAP 消息信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1197355/
我正在使用 SOAPHandler.handleMessage(...) 拦截从客户端到服务器的传出 SOAP 消息。 我需要确认拦截是在消息发送后发生的。不确定情况是否属实。有什么想法吗? 最佳答案
当 SOAPHandler 的 handleFault(SOAPMessageContext context) 方法被调用时,任何人都可以解释一下吗? 我的处理程序类是: public class W
我正在尝试设置一个 SOAPHandler在我的服务器上转换此传入请求 92623-15853588 对这个要求。
我尝试使用 SOAPHandler 更改 SOAP 消息的正文(请求的一部分的命名空间URI),但这似乎不起作用。更改的原因是,我必须与不同的客户端一起工作,并且有一个旧的客户端无法更改,因此我想更改
我正在编写一个 Java SOAP 客户端,其中多个响应异步返回到客户端 WebService。由于响应是异步的,客户端必须将 MessageId 传递到 SOAPHeader 中。然后,多个响应将传
我正在尝试用 java 创建一个 Soap 客户端,我必须使用我的私钥对 Soap 消息进行签名。 我正在使用配置了 WS-Security 的 SoapUI 获取响应。 我已经使用 wsimport
我在使用 Websphere7 和 RSA 7.5 中的注释来实现 JAX-WS 服务时遇到问题。请查看此链接,解释我遇到的确切问题: Exception java.util.zip.ZipFile.
我有一个也使用 SOAP WS(在 doGet 中)的 servlet。我想查看 SOAP 信封(或 soap 消息中的任何其他内容)。我将此代码添加到我的 servlet 类中: class Cli
我的 JAX-WS war 包含以下条目。 WEB-INF/lib/ WEB-INF/beans.xml // empty WEB-INF/lib/commons-logging-1.1.1.jar
使用 JAX-WS 2,我看到了其他人也提到过的一个问题。问题是,如果在处理程序中接收到 SOAP 消息,并且该 SOAP 消息很大——无论是由于碰巧有大量内容的内联 SOAP 正文元素,还是由于 M
IBM WebSphere Jax-WS RI 框架。我有一个 chunkHandler。我需要向客户端发送一行 xml 响应。我制作oneline xml。调试显示一切正常 - xml 是单行的。但
我只想在 handler-chain.xml 中调用的 handleMessage() 方法中使用 spring bean。 这是我的 handler-chain.xml:
我尝试使用 Mtom 传输文件,它工作得很好,直到我使用 SoapHandler 验证客户端签名。 SoapHandler 保留所有消息并将其更改为 base64 编码。因此,当我尝试获取大文件时,J
我需要在运行时根据soap header 的内容动态地将EntityManager分配给我的bean。我的计划是使用 SOAPHandler 从 header 中提取信息,然后将其存储在请求范围中。我
我有一个 SOAPHandler。我需要捕获响应的请求 public class SOAPLoggingHandler implements SOAPHandler { @Override
我在客户端创建了一个 SOAPHandler 来记录对服务器的传出请求并在 SOAP 消息中添加了一个 SOAP header 。它正在记录没有 header 部分的传出 soap xml。但是在服务
我有一个实现 SOAPHandler interface 的类. handleMessage 定义为: public boolean handleMessage(SOAPMessageContext
我正在客户端寻找一种方法,将对象传递给我的 SOAPHandler,而无需将我的 Port 对象转换为 BindingProvider 来获取请求上下文。通常您会看到如下代码: Map request
目前,我有两个处理程序,一个用于日志记录,一个用于签署 SOAP 消息(本质上会篡改 SOAP 消息)。如果没有处理程序链,MTOM 会按预期工作,插入对二进制内容的引用,而不是内联 base64 二
我有一个 JAX-WS 2.2 Web 服务,我必须获取与其通信的每个客户端的 IP 地址。我写了一个 SOAP 协议(protocol)处理程序,但我看不到地址,因为处理程序不包含此信息,并且使用
我是一名优秀的程序员,十分优秀!