Как предотвратить конфиденциальные данные от 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());
    }
}
Другие вопросы по тегам