#java #mysql #jdbc
#java #mysql #jdbc
Вопрос:
Я ищу способ получить пароль из объекта java.sql.Connection. Я знаю, что в объекте DatabaseMetaData есть метод GetUserName(), но, к сожалению, нет соответствующего метода getPassword(). Используя отладчик в Netbeans, я вижу поле для пароля, поэтому должен быть способ получить эту информацию с помощью отражения, но пока я не смог выяснить, как.
Комментарии:
1. Это будет интересно. Я не думаю, что это возможно через общедоступный API, как вы правильно указали. Возможно, где-нибудь в реализации драйвера или DriverManager, если это с открытым исходным кодом, вы можете узнать. Я сомневаюсь, что это в соединении.
2. Это одно из самых странных требований, которые я когда-либо видел. Кроме того, это может привести к нарушению безопасности.
3. итак, если вы видели это поле в отладчике, почему вы не можете получить его с помощью отражения?
4. java.sql.Connection является интерфейсом и не имеет «поля для пароля» или каких-либо других (нестатических) полей.
5. @Gillman Я думаю, нам всем следовало начать с этого вопроса: почему, черт возьми, вы не знаете пароль от соединений, которые используете?
Ответ №1:
Как я прокомментировал, единственным способом должен быть просмотр кода. Например, для MySQL используется последняя версия драйвера (5.1.15). Вы можете получить пароль следующим образом:
public static void main(String[] args) throws Exception{
ConnectionImpl con = (ConnectionImpl) DriverManager.getConnection("jdbc:mysql://localhost:3908/mydb?user=edalorzoamp;password=mandrake");
System.out.println(con.getProperties().get("password"));
con.close();
}
Но для этого вам нужно будет знать иерархию классов и детали ее реализации.
Другие базы данных, скорее всего, будут отличаться. Если ваша база данных с открытым исходным кодом, например MySQL, вы можете узнать подробности внутренней конструкции и найти способы получения пароля.
Комментарии:
1. Это работает очень хорошо и намного лучше, чем путь отражения, по которому я шел.
Ответ №2:
Это зависит от разработчика JDBC, поскольку пользователь и пароль передаются в драйвер в виде сопоставления.
Один из способов узнать, что такое пароль, — расширить драйвер и включить его.
class CustomDriver extends ImplementerDriver {
@Override
public Connection connect(String url, Properties info) throws SQLException {
super.connect(url, info);
// Extract password from info.
}
public String getPassword() {
....
}
}
Ответ №3:
Вы можете проанализировать файл конфигурации sever XML для параметров пула соединений и получить пароль оттуда. сложное решение, но оно работает.