Как предотвратить конфиденциальные данные от SyncInvoker.post?
Я отправляю запрос со следующим кодом:
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 ответ
Решение
Создайте пользовательский 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());
}
}