`
kylixs
  • 浏览: 66063 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

LDAP监听器测试例子

    博客分类:
  • Java
阅读更多

LDAP被广泛用来存储企业基础数据,如人员、组织机构、设备等等,而且LDAP通常作为集中的数据源,被各个业务系统使用。员工入职,需要及时为员工创建各个系统的帐号。目前基本上每个公司都有好几套业务系统,可能有很多个管理员,人多了麻烦事就来了……如果当LDAP服务器数据变化时,实时响应,执行同步或者其他一些操作,那就可以极大提高企业信息化水平,减少不必要的维护成本。说了那么多废话,下面才是正题,一个简单的ldap监听器例子,可以响应ldap服务器数据的变化,那样就可以做我们想要做的事情了

 

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.event.EventContext;
import javax.naming.event.NamespaceChangeListener;
import javax.naming.event.NamingEvent;
import javax.naming.event.NamingExceptionEvent;
import javax.naming.event.NamingListener;
import javax.naming.event.ObjectChangeListener;
import javax.naming.ldap.UnsolicitedNotificationEvent;
import javax.naming.ldap.UnsolicitedNotificationListener;

/**
 * LDAP 事件监听器测试
 */
class LDAPListenerTest {

    public static void main(String[] args) {
        // Set up environment for creating initial context
        Hashtable<String, Object> env = new Hashtable<String, Object>(11);
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");
        env.put(Context.SECURITY_PRINCIPAL, "cn=Manager");
        env.put(Context.SECURITY_CREDENTIALS, "secret");
        try {
            // Get event context for registering listener
            String baseDN = "ou=07,ou=csg,o=serc,c=cn";
            EventContext ctx = (EventContext) (new InitialContext(env).lookup(baseDN));
            // Create listener
            NamingListener unsolListener = new UnsolicitedNotificationListener() {

                public void notificationReceived(UnsolicitedNotificationEvent evt) {
                    System.out.println("received: " + evt + ",notification:" + evt.getNotification());
                }

                public void namingExceptionThrown(NamingExceptionEvent evt) {
                    System.out.println(">>> UnsolListener got an exception");
                    evt.getException().printStackTrace();
                }
            };
            NamingListener namespaceListener = new NamespaceChangeListener() {

                public void objectAdded(NamingEvent evt) {
                    System.out.println("objectAdded: " + evt.getOldBinding() + "\n=> " + evt.getNewBinding());
                    System.out.println("\tchangeInfo: " + evt.getChangeInfo());
                }

                public void objectRemoved(NamingEvent evt) {
                    System.out.println("objectRemoved: " + evt.getOldBinding() + "\n=> " + evt.getNewBinding());
                    System.out.println("\tchangeInfo: " + evt.getChangeInfo());
                }

                public void objectRenamed(NamingEvent evt) {
                    System.out.println("objectRenamed: " + evt.getOldBinding() + "\n=> " + evt.getNewBinding());
                    System.out.println("\tchangeInfo: " + evt.getChangeInfo());
                }

                public void namingExceptionThrown(NamingExceptionEvent evt) {
                    System.err.println(">>>NamespaceChangeListener Exception");
                    evt.getException().printStackTrace();
                }
            };
            NamingListener objectListener = new ObjectChangeListener() {

                public void objectChanged(NamingEvent evt) {
                    System.out.println("objectChanged: " + evt.getOldBinding() + "\n\t=> " + evt.getNewBinding());
                    System.out.println("\tchangeInfo: " + evt.getChangeInfo());
                }

                public void namingExceptionThrown(NamingExceptionEvent evt) {
                    System.err.println(">>>ObjectChangeListener Exception");
                    evt.getException().printStackTrace();
                }
            };
            // Register listener with context (all targets equivalent)
            ctx.addNamingListener("", EventContext.SUBTREE_SCOPE, unsolListener);
            ctx.addNamingListener("", EventContext.SUBTREE_SCOPE, namespaceListener);
            ctx.addNamingListener("", EventContext.SUBTREE_SCOPE, objectListener);
            System.out.println("Listener to LDAP server ...");
            // Wait 1 minutes for listener to receive events
            try {
                Thread.sleep(60000 * 60);
            } catch (InterruptedException e) {
                System.out.println("sleep interrupted");
            }
            // Not strictly necessary if we're going to close context anyhow
            ctx.removeNamingListener(unsolListener);
            // Close context when we're done
            ctx.close();
            System.out.println("Remove Listener ...");
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

 

测试环境是OpenDS2.0,如有什么问题欢迎联系我,kylixs@qq.com

分享到:
评论
3 楼 zhq502502 2018-11-30  
10年前的文章,现在早就不支持了,这是要害多少人那。
https://stackoverflow.com/questions/12383878/how-to-create-an-objectchangelistener-with-openldap
2 楼 Smith小可爱 2017-11-01  
>>>NamespaceChangeListener Exception
javax.naming.OperationNotSupportedException: [LDAP: error code 12 - 00000057: LdapErr: DSID-0C0907C5, comment: Error processing control, data 0, v1db1]; remaining name ''
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3196)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3082)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.getNextBatch(AbstractLdapNamingEnumeration.java:148)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMoreImpl(AbstractLdapNamingEnumeration.java:217)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMore(AbstractLdapNamingEnumeration.java:189)
at com.sun.jndi.ldap.NamingEventNotifier.run(NamingEventNotifier.java:135)
at java.lang.Thread.run(Thread.java:745)
>>>ObjectChangeListener Exception
javax.naming.OperationNotSupportedException: [LDAP: error code 12 - 00000057: LdapErr: DSID-0C0907C5, comment: Error processing control, data 0, v1db1]; remaining name ''
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3196)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3082)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.getNextBatch(AbstractLdapNamingEnumeration.java:148)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMoreImpl(AbstractLdapNamingEnumeration.java:217)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMore(AbstractLdapNamingEnumeration.java:189)
at com.sun.jndi.ldap.NamingEventNotifier.run(NamingEventNotifier.java:135)
at java.lang.Thread.run(Thread.java:745)
1 楼 rukawajw 2015-05-23  
报这样的错,怎么处理
Listener to LDAP server ...
>>>NamespaceChangeListener Exception
javax.naming.NamingException: LDAP response read timed out, timeout used:-1ms.
at com.sun.jndi.ldap.Connection.readReply(Unknown Source)
at com.sun.jndi.ldap.LdapClient.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapClient.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(Unknown Source)
at com.sun.jndi.ldap.NamingEventNotifier.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
>>>ObjectChangeListener Exception
javax.naming.NamingException: LDAP response read timed out, timeout used:-1ms.
at com.sun.jndi.ldap.Connection.readReply(Unknown Source)
at com.sun.jndi.ldap.LdapClient.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapClient.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.getSearchReply(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(Unknown Source)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(Unknown Source)
at com.sun.jndi.ldap.NamingEventNotifier.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

相关推荐

    ldap 访问AD测试

    标题 "ldap 访问AD测试" 暗示了我们即将探讨的是如何使用 Lightweight Directory Access Protocol (LDAP) 来访问和交互Active Directory (AD) 架构。在IT环境中,AD是一个广泛使用的目录服务,用于管理和组织用户、...

    LDAP的JAVA测试程序

    LDAP的java测试程序,可以用来测试你的LDAP配置是否正确

    LDAPBrowser 4.5 x86 LDAP测试工具

    LDAPBrowser4.5 x86 32位系统使用的LDAP测试工具

    ldap读取 测试使用

    这个"ldap读取 测试使用"的项目显然是一个使用Java实现的LDAP查询工具,目的是为了帮助开发者进行快速的LDAP操作测试。 在`LdapUtils.java`文件中,我们可以预期它包含了一些关键的Java类和方法,这些可能包括: 1...

    ldap helloworld 基本例子详解

    **LDAP HelloWorld 基本例子详解** 在本文中,我们将深入探讨如何配置、安装和使用LDAP(轻量级目录访问协议)进行基本操作。LDAP是一个开放标准,用于存储和检索目录信息,常用于身份验证、权限管理和组织数据的...

    Go-ldap-test-tool一个轻量级的ldap测试工具

    【Go-ldap-test-tool:一个轻量级的LDAP测试工具】 在信息技术领域,LDAP(Lightweight Directory Access Protocol)是一种用于访问和管理分布式目录服务的标准协议。它被广泛应用于组织内部的身份验证、用户权限...

    测试LDAP注入.docx

    测试LDAP注入 LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议)是一种用于访问网络中的目录服务的协议,目录是一个分级结构的数据存储区,其中可能包含任何类型的信息,但常用于保存个人信息,...

    ldap相关代码例子.rar

    这个压缩包“ldap相关代码例子.rar”包含了几个关键元素来帮助理解并实践LDAP操作。 1. **ApplicationTest.java** - 这是一个Java源代码文件,很可能是用于演示如何在Java应用程序中与LDAP服务器进行交互。在Java中...

    c操作ldap例子c操作ldap例

    ### C语言操作LDAP示例详解 #### 一、概述 本篇将详细介绍如何使用C语言进行LDAP(Lightweight Directory Access Protocol)的操作。LDAP是一种用于访问和管理目录服务的应用层协议,广泛应用于用户身份验证、权限...

    ldap测试相关资料

    本资料包聚焦于ldap的测试方面,特别是与嵌入式环境相关的测试。 首先,我们要理解LDAP的基础知识。LDAP目录服务是一种树形结构,其中每个条目都有一个唯一的DN(Distinguished Name),类似于人的身份证号。条目...

    非常好用的ldap连接工具

    6. **调试与性能分析**:内置 LDAP 操作的调试器和性能分析器,有助于优化 LDAP 服务器的性能和解决问题。 **关于 LDAP 和 Active Directory 的关联:** LDAP 是一种轻量级目录访问协议,广泛应用于组织的目录服务...

    springldap例子

    它简化了与LDAP目录的交互,通过提供模板类、操作构建器和强大的对象绑定模型,使得代码更加简洁、易于测试。在这个例子中,我们可能会看到如何配置`applicationContext.xml`文件来设置Spring LDAP环境。 首先,`...

    LdapBrowser282.rar_LdapBrows_LdapBrowser.282_ldap_ldapBrowser_op

    2. **搜索与过滤**:提供强大的搜索功能,允许用户根据特定条件查找目录中的信息,支持使用 LDAP 查询过滤器。 3. **编辑与创建**:用户可以创建新的目录条目,编辑现有条目的属性,或者删除不再需要的条目。 4. **...

    ldap相关测试记录文档

    - **vimslapd.conf**:`slapd.conf`是OpenLDAP服务器的主要配置文件,通过`vim`或其它文本编辑器对其进行编辑,可以调整LDAP服务的各种参数和选项。例如,添加如下两行配置: ```plaintext # 日志级别 logfile /...

    LdapBrowser2.82版和LDAP使用手册

    8. **测试连接**:使用LdapBrowser或其他工具验证服务器的可访问性和数据的正确性。 **使用LdapBrowser 2.82版** 1. **连接设置**:在LdapBrowser中输入服务器地址、端口、认证方式等信息,建立连接。 2. **浏览...

    LdapBrowser ldap连接工具

    **LDAP浏览器:深入理解与应用** LDAP(轻量级目录访问协议)是一种用于查询和管理分布式目录服务的网络协议,广泛应用于企业环境中的用户身份验证、权限管理和数据共享。LdapBrowser是一款专为开放源代码的...

Global site tag (gtag.js) - Google Analytics