1.准备过程

1.1  在windows server 2008 R2操作系统下搭建AD域,不懂得看链接地址:http://99532720.blog.51cto.com/2194488/696611

1.2.  可以使用LDAP客户端(Apache Directory Studio) 直接连接AD域,下载地址 http://directory.apache.org/studio/ 
  

1.3.  java语句要用到的jar包,下载地址:https://sourceforge.net/projects/ldap-sdk/

2.java操作过程(我这里只做同步查询,负责查询ldap数据,然后同步到我的数据库)

2.1  定义参数

  1. // 当前配置信息
  2. private static String ldapHost = "172.16.160.196";
  3. private static int ldapPort = 389;  //默认端口
  4. private static String ldapBindDN = "cn=zhangsan,rou=销售部一,ou=销售部,ou=哇哈哈公司,dc=tian,dc=com";
  5. private static String ldapPassword = "******";  //张三的密码
  6. private static LDAPConnection connection = null;

  dc就是你搭建AD域的时候创建的域名,就是如图

ldapBindDN的值:cn=zhangsan,rou=销售部一,ou=销售部,ou=哇哈哈公司,dc=tian,dc=com

这里的zhangsan是名字为张三的账号

2.1  创建Ldap连接

    

/** 连接LDAP */
public static void openConnection() {
  if (connection == null) {
    try {
      connection = new LDAPConnection(ldapHost, ldapPort, ldapBindDN, ldapPassword);
      System.out.println("连接成功!");
    } catch (Exception e) {
    System.out.println("连接LDAP出现错误:\n" + e.getMessage());
    }
  }
}

2.2  先查询出来ldap数据

  1. /** 查询 */
  2. public static void queryLdap(String searchDN, String filter) {
  3. try {
  4. // 连接LDAP
  5. openConnection();
  6. // 查询企业所有用户
  7. SearchRequest searchRequest = new SearchRequest(searchDN, SearchScope.SUB, "(" + filter + ")");
  8. searchRequest.addControl(new SubentriesRequestControl());
  9. SearchResult searchResult = connection.search(searchRequest);
  10. System.out.println(">>>共查询到" + searchResult.getSearchEntries().size() + "条记录");
  11. int index = 1;
  12. for (SearchResultEntry entry : searchResult.getSearchEntries()) {
  13. System.out.println((index++) + "\t" + entry.getDN());
  14. }
  15. } catch (Exception e) {
  16. System.out.println("查询错误,错误信息如下:\n" + e.getMessage());
  17. }
  18. }

2.2  测试

  1. public static void main(String[] args) {
  2. String searchBase="ou=销售部,ou=哇哈哈公司,dc=tian,dc=com";
  3. String filter = "objectClass=organizationalUnit";  //这是查询所有部门的
  4. //objectClass=person这是查询所有用户的,objectClass=group这是查询部门下所有的讨论组的,objectClass=*这是查询所有
  5. queryLdap(searchBase, filter);
  6. }

2.3  贴一点同步用户用到的地方

  保存用户的类根据具体情况自己设置属性

/** 先从ldap里查询 然后同步用户到数据库用的*/
public void queryLdap(String searchDN, String filter) {
try {
// 连接LDAP
openConnection();

// 查询企业所有用户
SearchRequest searchRequest = new SearchRequest(searchDN, SearchScope.SUB, "(" + filter + ")");
searchRequest.addControl(new SubentriesRequestControl());
SearchResult searchResult = connection.search(searchRequest);
System.out.println(">>>共查询到" + searchResult.getSearchEntries().size() + "条记录");
int index = 1;
Connection con=null;
UserDate user=null;
con=dbUtil.getCon();
for (SearchResultEntry entry : searchResult.getSearchEntries()) {

System.out.println((index++) + "\t" + entry.getDN());
System.out.println(entry.toString());

//遍历entry,获取有效数据
Collection<Attribute> ca=entry.getAttributes();
Iterator<Attribute> itr=ca.iterator();
user=new UserDate();
String uuid = UUID.randomUUID().toString();
user.setId(uuid);
user.setAccountType(0);
Date date=new Date();
user.setCreateTime(date);
while(itr.hasNext()){
Attribute ab=itr.next();
String name=ab.getName();
/*String value=ab.getValue();
System.out.println("=="+value);
System.out.println("--"+name);*/
if(name.equals("sAMAccountName")){ //用户登录名
user.setAccount(ab.getValue());
}
if(name.equals("mail")){ //电子邮件
user.setEmail(ab.getValue());
}
if(name.equals("mobile")){ //手机号
user.setMobile(ab.getValue());
}
if(name.equals("displayName")){ //姓名
user.setName(ab.getValue());
}
if(name.equals("postalCode")){
user.setZipCode(ab.getValue());
}
if(name.equals("l")){//市
user.setLocationAddress(ab.getValue());
}
if(name.equals("st")){//省
String address1=user.getLocationAddress();
user.setLocationAddress(ab.getValue()+address1);
}
if(name.equals("co")){//国家
String address2=user.getLocationAddress();
user.setLocationAddress(ab.getValue()+address2);
}
if(name.equals("streetAddress")){//街道
String address2=user.getLocationAddress();
user.setLocationAddress(address2+ab.getValue());
}

}
System.out.println("用户信息:"+user);
int result=userDao.saveUser(con, user);
if(result>0){
System.out.println("保存用户成功!");
}else{
System.out.println("保存用户失败!");
}

System.out.println("*******************************");
}
} catch (Exception e) {
System.out.println("查询错误,错误信息如下:\n" + e.getMessage());
}
}

java同步ldap实例的更多相关文章

  1. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  2. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  3. Java同步块

    原文:http://ifeve.com/synchronized-blocks/ Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本 ...

  4. Java同步块(synchronized block)使用详解

    Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...

  5. 转:Java同步synchronized使用

    原文链接 作者:Jakob Jenkov Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(s ...

  6. LDAP实例异常停止日志提示虚拟内存virtual memory不足

    [05/Oct/2014:20:50:37 +0800] - ERROR<5135> - Resource Limit - conn=-1 op=-1 msgId=-1 - Memory ...

  7. java同步synchronized

    java同步synchronized volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性. 看下面的这段代码: /** * * @author InJavaWeTrust * */ ...

  8. Java同步简介

    Java同步 Java中同步一直都是很重要的问题,对于初学者来说也是不太容易能理解的问题.特在此记录一下有关Java中同步和锁的知识.主要涉及到同步的概念以及Java中解决的办法和简单的例子.有关锁L ...

  9. Java同步学习(持续更新)

    在需要考虑线程安全性的场合,可以考虑以下五种方式来实现线程的安全性: 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,   ...

随机推荐

  1. Django框架<一>

    Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sess ...

  2. 64_s2

    sipwitch-1.9.15-3.fc26.x86_64.rpm 13-Feb-2017 09:19 162822 sipwitch-cgi-1.9.15-3.fc26.x86_64.rpm 13- ...

  3. Mathtype公式位置偏上

    Mathtype公式位置偏上 部分Mathtype公式与文档文字没有很好的对齐,而是浮起来了,也就是说Mathtype公式的位置比正常文字稍高,这是我写论文时碰到的一个很麻烦的问题.然后就是行距稍微大 ...

  4. HDU 3085 Nightmare Ⅱ(双向BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...

  5. js中的cookie使用和vue-cookie的使用

    在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cookie规范定义了服务器和客户端交互信息的格式.生存期.使用范围.安全性. 在JavaScrip ...

  6. spring boot 扩展之AutoConfigurationImportListener

    最近阅读spring boot源码时发现,发现当spring使用ConfigurationClassParser加载使用@Configuration注解类后,会使用AutoConfigurationI ...

  7. 14:Spark Streaming源码解读之State管理之updateStateByKey和mapWithState解密

    首先简单解释一下)) //要使用updateStateByKey方法,必须设置Checkpoint. ssc.checkpoint("/checkpoint/") val sock ...

  8. CodeForces 803F Coprime Subsequences

    $dp$. 记$dp[i]$表示$gcd$为$i$的倍数的子序列的方案数.然后倒着推一遍减去倍数的方案数就可以得到想要的答案了. #include <iostream> #include ...

  9. Blob和Clob在JDBC中的简介

    数据库在当今的应用越来越广泛了,同样伴随着领域的广泛,存储的内容也不在是只有数值.字符.boolean几种类型,而是越来越多样化.在这样的前提下就出现了Blob和Clob两个类型.下面我将对这个两个类 ...

  10. vue-router在IE11中页面不跳转

    情景: IE11浏览器中,在进行正常页面跳转操作后(页面A跳转到页面B),点击浏览器的左上角的‘后退’按钮,点击后,可以看到url地址已经发生了变化(url由页面B变为页面A),hash值也已经是上一 ...