我正在发送带有以下代码的请求:
final WebTarget target = client.target(url);
CustomResponse response = target.request(MediaType.APPLICATION_XML_TYPE)
.post(Entity.xml(password), CustomResponse.class);
身份验证旨在接受用户名作为url
的一部分,而密码是在请求主体中发送的。
问题是密码显示在日志中,该日志由javax.ws.rs
库中的类ClientRequest#writeEntity()
生成。
那么,我的问题是该库如何在不关闭记录的情况下不将密码存储在日志中的强制?
谢谢。
创建一个自定义java.util.logging.filter,然后在生成日志记录的Java.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());
}
}