我用纯 Java 创建了 SOAP 客户端。我还实现了 SOAPHandler 来跟踪 SOAP 请求和响应。但是当我看到系统输出时,请求中缺少 header 部分。 请注意,我正在调用企业服务,并且需要强制安全 header 才能调用该服务。我在响应中返回了我的安全 header 并得到了正确的响应,并且也正在 sysout。 来自 SOAPHandler 的空白 header 跟踪可能是什么问题?以下是我的处理程序代码:
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
private static final Logger log = LoggerFactory.getLogger(SOAPLoggingHandler.class);
public boolean handleMessage(SOAPMessageContext context) {
log.info("handleMessage");
logToSystemOut(context);
return true;
}
public boolean handleFault(SOAPMessageContext context) {
log.info("SOAP Fault Occur");
logToSystemOut(context);
return true;
}
public void close(MessageContext context) {
log.info("close");
}
public Set<QName> getHeaders() {
log.info("getHeaders");
return null;
}
protected void logToSystemOut(SOAPMessageContext smc) {
final Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
final String message = !outboundProperty.booleanValue() ? "Web Service Response\n" : "Web Service Request\n";
logMessage(smc, message);
}
protected void logToSystemOut(SOAPMessageContext smc, String message) {
logMessage(smc, message);
}
private void logMessage(SOAPMessageContext smc, String message) {
try {
final ByteArrayOutputStream oStream = new ByteArrayOutputStream();
final Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(smc.getMessage().getSOAPPart()), new StreamResult(oStream));
oStream.close();
log.info(message + new String(oStream.toByteArray()));
} catch (final Exception e) {
log.warn("Failed to log web service message", e);
}
//some custom logging going on below - could be ignored
SomeLogger someLoggerObj = SomeLogger.getInstance();
try {
someLoggerObj.logSomeMessage(smc, message);
} catch (SOAPException e) {
log.error("SOAP Exception occurred :", e);
} catch (TransformerException e) {
log.error("TransformerException Exception occurred :", e);
}
}
}
我的标题被视为:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
最佳答案
我这周遇到了完全相同的问题,我有 5 个 SOAP 调用链以及 TLS 和 SAML,以及使用 AXIS 和 CXF 实现的混合服务,在 OpenJDK 11 上的同一个 Tomcat 9 下运行。问题只发生在生产服务器(RedHat 服务器)上,我无法在我的开发机器上重现它, header 已被 java 客户端完全丢弃,无法在服务器上进行调试。
我最终在目标服务器上安装了 JDK 1.8 上的专用 Tomcat 8.5,以运行与 AXIS 服务分开的 CXF 服务。 如果有人有如此复杂的配置,希望这会有所帮助,这不是解决方案,而是解决方法。
https://stackoverflow.com/questions/54436305/
相关文章:
python - 如何在 Mac 上将 Python 完全恢复为出厂设置
python - 如何在 django 中使用 ajax 形式验证 django-recaptcha
angular - 如何在 ngrx 效果中使用 LatestFrom 进行单元测试
Python:DataFrame.melt - 如何选择一系列列作为标识符变量?
python-3.x - celery 错误 : result. get(timeout=5) 超时
spring-boot - 如何在 Spring Security oauth2 中调试重定向 ur
typo3 - 使用流体创建数组和对象 f :variable