0

我正在用 Spring WS 编写 Web 服务。我必须记录所有请求和响应。如果消息在语法上是正确的,SoapEnvelopeLoggingInterceptor会处理日志。

不幸的是,一些对 Web 服务的请求可能在语法上不正确,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Message>
    <foo>Hello, </foo>
    <!-- > symbol is missing: -->
    <bar>World!</bar
</Message>

当这条消息发送到我的服务时,服务器拒绝接受它,说:“客户端发送的请求在语法上不正确”。

也许有人可以给我一个关于如何记录语法错误消息的提示?

4

2 回答 2

1

无效的 SOAP 请求不会到达您的 Web 服务方法,但是对于 SOAP,客户端有责任发送有效请求。如果他们没有,他们的代码中有错误,而不是你的。

但是,如果您希望记录无效请求,那么您可以使用 Log4J(或任何您连接的日志框架)来执行此操作。如果您查看 SoapEnvelopeLoggingInterceptor 代码,您会发现它实现了 SOAP 故障的调试级别日志记录。

https://github.com/spring-projects/spring-ws/blob/master/core/src/main/java/org/springframework/ws/soap/server/endpoint/interceptor/SoapEnvelopeLoggingInterceptor.java?source=cc

public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
    if (logFault && logger.isDebugEnabled()) {
        logMessageSource("Fault: ", getSource(messageContext.getResponse()));
    }
    return true;
}

因此,通过配置在自己的文件中记录 SOAP 错误,您可以对失败的请求进行某种审计。您甚至可以监视该文件,以便其中的任何条目都会引起警报。

<appender name="soapFaultAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="/var/log/myapp/soap-faults.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %p [%c{3}] %m%n" />
    </layout>
</appender>
<appender name="async" class="org.apache.log4j.AsyncAppender">
    <param name="BufferSize" value="1024"/> 
    <appender-ref ref="soapFaultAppender"/>
</appender>
<logger name="org.springframework.ws.soap.server.endpoint.interceptor">
    <level value="debug" />
</logger>
于 2013-11-12T09:22:23.477 回答
0

我会考虑在您的应用程序堆栈中放置一个过滤器来为您处理日志记录。我认为您将失去使用 SoapEnvelopeLoggingInterceptor 的能力,但是在您的应用程序决定它只对正确格式的 XML 消息感兴趣之前,您将处理该消息。

于 2013-11-12T08:53:08.310 回答