停止Apache CXF记录MultipartBody附件的二进制数据

Mea*_*ell 3 java logging cxf interceptor

我需要阻止CXF记录MultipartBody对象中的附件的二进制数据(由AbstractLoggingInterceptor出站消息中的抛出).当我添加my时LoggingInInterceptor,我设置setShowBinaryData为false,但这似乎不会阻止多部分消息中的二进制数据被记录.

我不确定是否需要创建自定义loggingInInterceptor,或者是否有一种配置现有拦截器的方法来截断它找到的任何二进制数据.停止它完全记录MultipartBody响应,或截断数据都是可接受的解决方案.

Kar*_*sad 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");
    }
Run Code Online (Sandbox Code Playgroud)

假设您的内容类型是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

不使用内容类型的另一种方法如下所示.

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();  
    }
}
Run Code Online (Sandbox Code Playgroud)