关于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

浙公网安备 33010602011771号