Я новичок в аутентификации Java LDAP с использованием JNDI. При поиске в Интернете учебных пособий я нашел пример кода по следующему URL-адресу,
http://www.javaxt.com/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory
Я создаю веб-приложение, используя JavaServlet и JSP.
Просто я хочу аутентифицировать пользователей с помощью LDAP.
Мой сервер Apache, Tomcat, и я использую для этого Xampp.
Теперь система хорошо аутентифицирует пользователей с помощью LDAP, но иногда выдает ошибочное исключение.
«javax.naming.NamingException: не удалось подключиться к xxxxxx.com»
Осталось около часа, автоматически система снова заработает.
может ли кто-нибудь сказать мне, в чем будет проблема?
Я сменил сервер на GlassFish, но проблема та же.
Вот мой код,
public static LdapContext getConnection (String username, String password,
String domainName, String serverName) throws NamingException {
if (domainName == null) {
try {
String fqdn = java.net.InetAddress.getLocalHost()
.getCanonicalHostName();
if (fqdn.split("\\.").length > 1) {
domainName = fqdn.substring(fqdn.indexOf(".") + 1);
}
} catch (java.net.UnknownHostException e) {
}
}
if (password != null) {
password = password.trim();
if (password.length() == 0) {
password = null;
}
}
Hashtable props = new Hashtable();
String principalName = username + "@" + domainName;
props.put(Context.SECURITY_PRINCIPAL, principalName);
if (password != null) {
props.put(Context.SECURITY_CREDENTIALS, password);
}
String ldapURL = "ldap://"
+ ((serverName == null) ? domainName : serverName + "."
+ domainName) +":389/";
String Auth_Metho="simple";
props.put(Context.SECURITY_AUTHENTICATION,
Auth_Metho);
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, ldapURL);
props.put("com.sun.jndi.ldap.read.timeout", "0");
try {
return new InitialLdapContext(props, null);
} catch (javax.naming.CommunicationException e) {
throw new NamingException("Failed to connect to " + domainName
+ ((serverName == null) ? "" : " through " + serverName));
} catch (NamingException e) {
throw new NamingException("Failed to authenticate " + username
+ "@" + domainName
+ ((serverName == null) ? "" : " through " + serverName));
}
}
//Then call it as....
String SreverName = "xxxxxx.com";
String userName = "xxxxx";
String password ="xxxxx";
LdapContext ctx;
try {
ctx = ActiveDirectory.getConnection( userName ,
password , SreverName);
ctx.close(); // unameStr, passStr,
System.out.println("Authenticated!");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
javax.naming.CommunicationException: xxxxxx.com:389 [Root exception is java.net.ConnectException: Connection timed out: connect] at com.sun.jndi.ldap.Connection.<init>(Unknown Source) ... more ...
И я сериализовал Hashtable, но проблема та же. 13.08.2014props.put("com.sun.jndi.ldap.read.timeout", "0");
, но ничего не изменилось. 13.08.2014com.sun.jndi.ldap.read.timeout
применяется только для чтения данных из LDAP. Я считаю, что настройка, которую вы хотите, будетcom.sun.jndi.ldap.connect.timeout
. Я не верю, что установка времени ожидания соединения на 0 будет иметь значение (но я полагаю, что стоит попробовать). Вы спрашивали своего администратора LDAP, отключают ли они сервер для запланированного резервного копирования? Я по-прежнему считаю, что это наиболее вероятное объяснение: любой порядочный администратор LDAP будет регулярно выполнять резервное копирование и реорганизацию. 13.08.2014