如何防止SyncInvoker.post记录敏感数据?

时间:2016-11-25 11:26:17

标签: java logging javax.ws.rs javax

我发送的请求包含以下代码:

final WebTarget target = client.target(url);
CustomResponse response = target.request(MediaType.APPLICATION_XML_TYPE)
                          .post(Entity.xml(password), CustomResponse.class);

身份验证旨在接受用户名作为url的一部分,而密码则在请求正文中发送。

问题是密码显示在由ClientRequest#writeEntity()库中的类javax.ws.rs生成的日志中。

所以,我的问题是如何强制该库不在日志中存储密码而不关闭注销?

谢谢。

1 个答案:

答案 0 :(得分:1)

创建自定义official futures example并将其安装在生成java.util.logging.Filterjava.util.logging.Logger上。您可以通过返回false来省略该日志条目,或者只是重写日志记录的参数或消息,使其不包含密码。

import java.util.logging.Filter;
import java.util.logging.LogRecord;


public class PasswordFilter implements Filter {

    @Override
    public boolean isLoggable(LogRecord record) {
        if (isPasswordCallSite(record)) {
           //return false; // omit log entry.
           //Or hide password.
           Object[] params = record.getParameters();
           if (params != null && params.length != 0) {
               params = params.clone();
               String data = String.valueOf(params[0]);

                //Write code to find and replace password.
               params[0] = data;
               record.setParameters(params);
           }
        }
        return true;
    }

    private boolean isPasswordCallSite(LogRecord r) {
        return "foo.bar.ClientRequest".equals(r.getSourceClassName())
                && "writeEntity".equals(r.getSourceMethodName());
    }
}