`
kylixs
  • 浏览: 66016 次
  • 性别: 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)

相关推荐

    pl/sql developer 监听、tnsnames.ora

    监听器(Listener)是Oracle数据库服务的一部分,它负责接收来自客户端的连接请求,并将这些请求路由到相应的数据库实例。监听器运行在数据库服务器上,监听特定的网络端口,等待客户端的连接请求。当一个客户端尝试...

    jmeter图文入门教程

    1.6.2.添加监听器 新增一个监控器(Listener),例如“ViewResultsinTable”,以便查看请求结果。 1.6.3.运行测试计划 单击“Run&gt;Start”菜单,运行测试计划。 1.6.4.查看运行监控指标 单击“ViewResultsinTable”...

    Acegi 例子

    5. **测试和调试**:在开发过程中,使用 Acegi 提供的工具进行测试和调试,确保安全策略的正确性。 然而,值得注意的是,Acegi 在后期已经被 Spring Security 所取代,Spring Security 是 Acegi 的继承者,提供了更...

    Spring Security 2.0.x完全中文参考文档

    在部署Spring Security之前,首先需要在web.xml中声明所需的上下文参数和监听器。 - **2.2.2. 最小配置** `&lt;http&gt;`标签是Spring Security配置中最常用的标签之一,它可以用来指定各种安全策略。最小配置通常包含...

    Testautomation-with-Puppeteer:一些使用puppeteer.js的客户端项目的自动化浏览器测试用例

    总的来说,"Testautomation-with-Puppeteer" 是一个实践 Puppeteer 自动化测试的好例子,通过学习和理解这个项目,你可以掌握如何为客户端项目构建高效、可靠的浏览器自动化测试框架。同时,Puppeteer 的易用性和...

    Sangfor上网行为管理单点登录配置汇编.pdf

    在配置LDAP域的单点登录时,我们以一个具体的例子来说明。假设公司内有一个AD域服务器,域名为123.com,IP地址为192.168.1.24。目标是让用户登录域后,通过AC设备自动认证上网,并将AD域中的"train"组织单元(OU)...

    ORACLE9i_优化设计与系统调整

    §2.4.1.6 理解监听日志中信息 50 §2.4.1.7 理解连接管理器信息 53 §2.4.2 跟踪文件( Trace File ) 53 §2.4.2.1 跟踪文件的命名: 54 §2.4.2.2 参数设置与初始化文件: 54 §2.4.2.3 在控制实用程序运行中设置...

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

    5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

Global site tag (gtag.js) - Google Analytics