gpt4 book ai didi

java - JNDI/LDAP 的陈旧套接字连接泄漏

转载 作者:行者123 更新时间:2023-12-02 03:45:41 25 4
gpt4 key购买 nike

我目前正在查看 Oracle 的示例如何 manually follow referrals (case throw) 在 Java/JNDI 中通过 LDAP 从目录服务器返回。可以下载相关示例源代码 here .

有问题的代码:

// Set up environment for creating initial context
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:489/o=JNDITutorial");

// Set referral property to throw ReferralException
env.put(Context.REFERRAL, "throw");

try {
// Create initial context
DirContext ctx = new InitialDirContext(env);

// Set controls for performing subtree search
SearchControls ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

// Do this in a loop because we don't know how
// many referrals there will be
for (boolean moreReferrals = true; moreReferrals;) {
try {
// Perform search
NamingEnumeration answer = ctx.search("", "(objectclass=*)",
ctls);

// Print the answer
while (answer.hasMore()) {
System.out.println(">>>" +
((SearchResult)answer.next()).getName());
}

// search completes with no more referrals
moreReferrals = false;

} catch (ReferralException e) {

if (! followReferral(e.getReferralInfo())) {
moreReferrals = e.skipReferral();
}

// point to the new context
if (moreReferrals) {
ctx = (DirContext) e.getReferralContext();
}
}
}

// Close the context when we're done
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
}

我认为这段代码在几个方面存在缺陷。 DirContextNamingEmuneration 的文档提供了一个立即释放资源的 close 方法。特别是前者持有到目标服务器的开放套接字。不关闭它会导致套接字泄漏。

我对代码的理解(缺陷)是:

  1. NamingEnumeration answer 永远不会关闭。
  2. 在发生 NamingException 的情况下,第一个 DirContext 未关闭,应移至 finally block 。
  3. 使用 e.getReferralContext() 创建的 DirContext 会覆盖 ctx,这意味着中间引用以及 InitialDirContext code> 永远不会关闭并导致泄漏。

我的发现正确吗?

PS:我还检查了 Oracle 在设置 follow 的情况下的内部实现,有趣的是所有引用上下文都在内部关闭。

免责声明:我最初将此发布于 Code Review但它被关闭了,因为它不是我的代码。有人建议我尝试一下。

最佳答案

您需要关闭 NamingEnumeration 以及从 JNDI 获得的任何其他可关闭的内容。

关于java - JNDI/LDAP 的陈旧套接字连接泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36331214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com