關於ldap中的DirContext物件小坑
阿新 • • 發佈:2021-10-26
之前我一直通過以下程式碼將DirContext放入spring ioc容器中
@Configuration @ConfigurationProperties(prefix = "ldap") @Data public class LdapConfiguration { private String urls; private String username; private String password; @Bean public DirContext getLdapContext(){ //載入匯入jdk的域證書 String keystore = "D:/JDK/jre/lib/security/cacerts"; System.setProperty("javax.net.ssl.trustStore", keystore); //宣告DirContext執行物件 DirContext dc = null; Properties env = new Properties(); //設定LDAP工廠 env.put(Context.INITIAL_CONTEXT_FACTORY, ConstantEnum.INITIAL_CONTEXT_FACTORY.getValue());//設定驗證型別,LDAP訪問安全級別:"none","simple","strong" env.put(Context.SECURITY_AUTHENTICATION, ConstantEnum.SECURITY_AUTHENTICATION.getValue()); //使用者名稱稱,cn,ou,dc 分別:使用者,組,域 env.put(Context.SECURITY_PRINCIPAL, username); //使用者密碼 cn 的密碼 env.put(Context.SECURITY_CREDENTIALS, password);//url 格式:協議://ip:埠/組,域 ,直接連線到域或者組上面 env.put(Context.PROVIDER_URL, urls); //設定連線SSL協議 env.put(Context.SECURITY_PROTOCOL, ConstantEnum.SECURITY_PROTOCOL.getValue()); try { dc = new InitialLdapContext(env, null); System.out.println("AD域服務連線認證成功"); return dc; } catch (Exception e) { System.out.println("AD域服務連線認證失敗"); e.printStackTrace(); return null; } } }
在後面的測試中發現專案啟動之初DirContext物件還好使,但過個兩個小時之後DirContext就不好使了,操作AD域直接報錯
最初猜測為GC將ioc容器中的物件回收了,後面發現並不是,最後判斷為DirContext有一個過期時間超過過期時間DirContext物件就無法回連所以對AD域的操作也就失敗了
解決方法是在每次對AD域操作時就建立一個DirContext物件,操作完成之後close掉就可以了
本文來自部落格園,作者:夏末初秋~,轉載請註明原文連結:https://www.cnblogs.com/nanjiechen/p/15466081.html