如何使用 Java JAX-WS 添加 SOAP 标头
Posted
技术标签:
【中文标题】如何使用 Java JAX-WS 添加 SOAP 标头【英文标题】:How do I add a SOAP Header using Java JAX-WS 【发布时间】:2010-10-24 06:15:32 【问题描述】:使用 JAX-WS 的典型 SOAP 客户端请求可能是
FooService service = new FooService();
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);
这会生成类似的 HTTP 请求内容
<?xml ... ?>
<S:Envelope xmlns:S="http://...soap-envelope">
<S:Body>
<!-- payload -->
</S:Body>
</S:Envelope>
通过操纵 port.processRequest() 调用的参数,您只能影响“有效负载”部分。您不能影响 XML 消息的外部部分。
我想在 SOAP 正文之前插入一个 SOAP 标头
<S:Header>
<X:Security xmlns:X="http://...wsssecurity...>
<X:BinarySecurityToken>kjh...897=</X:BinarySecurityToken>
</X:Security>
</S:Header>
我该怎么做?
【问题讨论】:
WSDL 是否描述了标头?如果是这样,那么 JAX-WS 不会生成添加它们的代码吗? 【参考方案1】:谢谢努诺,
只要我弄清楚如何正确登录到 ***.com,我就会对您的回复做正确的事情。
与此同时,这是我最终得到的代码:
FooService service = new FooService();
service.setHandlerResolver(new HandlerResolver()
public List<Handler> getHandlerChain(PortInfo portInfo)
List<Handler> handlerList = new ArrayList<Handler>();
handlerList.add(new RGBSOAPHandler());
return handlerList;
);
FooPort port = service.getFooPort();
FooPayload payload = new FooPayload();
payload.setHatSize(3);
payload.setAlias("The Hat");
...
port.processRequest(payload);
和
class RGBSOAPHandler implements SOAPHandler<SOAPMessageContext>
public Set<QName> getHeaders()
return new TreeSet();
public boolean handleMessage(SOAPMessageContext context)
Boolean outboundProperty =
(Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue())
SOAPMessage message = context.getMessage();
try
SOAPEnvelope envelope = context.getMessage()
.getSOAPPart().getEnvelope();
SOAPFactory factory = SOAPFactory.newInstance();
String prefix = "X";
String uri = "http://...wsssecurity...";
SOAPElement securityElem =
factory.createElement("Security",prefix,uri);
SOAPElement tokenElem =
factory.createElement("BinarySecurityToken",prefix,uri);
tokenElem.addTextNode("kjh...897=");
securityElem.addChildElement(tokenElem);
SOAPHeader header = envelope.addHeader();
header.addChildElement(securityElem);
catch (Exception e)
System.out.println("Exception in handler: " + e);
else
// inbound
return true;
public boolean handleFault(SOAPMessageContext context)
throw new UnsupportedOperationException("Not supported yet.");
public void close(MessageContext context)
//
【讨论】:
我正在采取与您完全相同的步骤,但我遇到了以下异常:org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: 尝试插入一个不存在的节点允许。你遇到过这个问题吗?该应用在 weblogic 10.1 上运行【参考方案2】:您可能想查看处理程序和处理程序链。- 我最近必须向给定的 Web 服务调用添加一个 cookie,我就是这样做的,只是创建了一个拦截初始调用并注入 cookie 的处理程序,你还可以使用 Pivot Handler 来操作调用标头
【讨论】:
【参考方案3】:对于添加 Soap 标头,如果您在 Web 应用程序服务器上实现 WS,则在您按照 WS-SECURITY 标准配置后,Was 将在标头添加安全部分,例如 web-policy 等。我不明白为什么除了加密的内容部分,比如加密的密码等,还需要自己添加
【讨论】:
以上是关于如何使用 Java JAX-WS 添加 SOAP 标头的主要内容,如果未能解决你的问题,请参考以下文章
Java Paypal 集成 SOAP JAX-WS - SSL 握手异常
java使用POST发送soap报文请求webservice返回500错误解析
(原创)用JAX-WS+Spring实现简单soap规范的webservice
带有 SOAP XML JAX-WS(WAS Portal 7)服务的 Java 1.6 Maven 项目对 Tomcat Liferay 6.2 GA6 无法访问端点