关于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掉就可以了

posted @ 2021-10-26 15:35  夏末初秋~  阅读(647)  评论(0)    收藏  举报