如何防止 SyncInvoker.post 记录敏感数据?
How to prevent sensitive data from being logged by SyncInvoker.post?
我正在使用以下代码发送请求:
final WebTarget target = client.target(url);
CustomResponse response = target.request(MediaType.APPLICATION_XML_TYPE)
.post(Entity.xml(password), CustomResponse.class);
身份验证旨在接受用户名作为 url
的一部分,而密码在请求正文中发送。
问题是密码显示在 class ClientRequest#writeEntity()
在 javax.ws.rs
库中生成的日志中。
所以,我的问题是如何强制该库在不关闭注销的情况下不在日志中存储密码?
谢谢。
创建自定义 java.util.logging.Filter and install it on the java.util.logging.Logger that is generating the log record。您可以通过返回 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());
}
}
我正在使用以下代码发送请求:
final WebTarget target = client.target(url);
CustomResponse response = target.request(MediaType.APPLICATION_XML_TYPE)
.post(Entity.xml(password), CustomResponse.class);
身份验证旨在接受用户名作为 url
的一部分,而密码在请求正文中发送。
问题是密码显示在 class ClientRequest#writeEntity()
在 javax.ws.rs
库中生成的日志中。
所以,我的问题是如何强制该库在不关闭注销的情况下不在日志中存储密码?
谢谢。
创建自定义 java.util.logging.Filter and install it on the java.util.logging.Logger that is generating the log record。您可以通过返回 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());
}
}