1. 程式人生 > 其它 >關於ldap中的DirContext物件小坑

關於ldap中的DirContext物件小坑

之前我一直通過以下程式碼將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