我需要阻止CXF在MultipartBody
对象(由出站消息中的AbstractLoggingInterceptor
抛出)中记录附件的二进制数据。当我添加LoggingInInterceptor
时,我将setShowBinaryData
设置为false,但这似乎不会阻止多部分消息中的二进制数据被记录。
我不确定是否需要创建自定义loggingInInterceptor,或者是否有办法配置现有拦截器以截断它找到的任何二进制数据。停止它完全记录MultipartBody响应,或截断数据都是可接受的解决方案。
答案 0 :(得分:5)
showBinaryContent
为false,但根据内容类型记录二进制数据,目前,如果您的内容类型不是以下任何内容;将记录二进制数据。
static {
BINARY_CONTENT_MEDIA_TYPES = new ArrayList<String>();
BINARY_CONTENT_MEDIA_TYPES.add("application/octet-stream");
BINARY_CONTENT_MEDIA_TYPES.add("image/png");
BINARY_CONTENT_MEDIA_TYPES.add("image/jpeg");
BINARY_CONTENT_MEDIA_TYPES.add("image/gif");
}
假设您的内容类型为application/zip
,您可以创建自定义拦截器并覆盖isBinaryContent,如下所示
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingMessage;
public class KPLogOutInterceptor extends LoggingOutInterceptor {
@Override
public boolean isBinaryContent(String contentType) {
return contentType != null && (BINARY_CONTENT_MEDIA_TYPES.contains(contentType)|| "application/zip".equals(contentType);
}
}
不使用内容类型的另一种方法如下所示。
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingMessage;
public class KPLogOutInterceptor extends LoggingOutInterceptor {
@Override
protected String formatLoggingMessage(LoggingMessage loggingMessage) {
return removePayload(loggingMessage.toString());
}
private String removePayload(String str){
StringBuilder builder = new StringBuilder(str);
if (str.indexOf("Payload:") + 9 > 8) {
builder.setLength(builder.indexOf("Payload:") + 8);
builder.append(" <content skipped>\n");
builder.append(StringUtils.repeat('-', 25));
}
return builder.toString();
}
}