目前从 java 我正在使用以下代码连接到 LDAP,非常典型的示例:
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, user);
env.put(Context.SECURITY_CREDENTIALS, password);
LdapContext ctx = null;
try
{
ctx = new InitialLdapContext(env, null);
return true;
}
catch (NamingException ex)
{
return false;
}
finally
{
if (ctx != null)
{
try {
ctx.close();
} catch (NamingException e) {
log.warn(e.getMessage());
}
}
}
这适用于对用户进行身份验证。但是,LDAP 管理员告诉我,当绑定不成功时,我没有正常断开连接。LDAP 端的错误是(例如):
[24/Jan/2013:13:20:44 -0500] conn=249 op=-1 msgId=-1 - 从 [ipaddress]:44724 关闭 - A1 - 客户端中止连接 -
他还说,当身份验证成功时,断开连接是优雅的。我想这是因为我ctx.close()
在那种情况下这样做。
但是,当身份验证失败时,实际上会从new InitialLdapContext(env, null)
线路中抛出一个异常。因此不会返回任何上下文,并且不会在任何上下文上调用关闭。
有没有办法在尝试身份验证之前检索某种连接对象,以便我可以在之后关闭它,无论身份验证是否成功?