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
分享到:
- 2009-07-15 17:01
- 浏览 5567
- 评论(3)
- 论坛回复 / 浏览 (0 / 3026)
- 查看更多
相关推荐
监听器(Listener)是Oracle数据库服务的一部分,它负责接收来自客户端的连接请求,并将这些请求路由到相应的数据库实例。监听器运行在数据库服务器上,监听特定的网络端口,等待客户端的连接请求。当一个客户端尝试...
1.6.2.添加监听器 新增一个监控器(Listener),例如“ViewResultsinTable”,以便查看请求结果。 1.6.3.运行测试计划 单击“Run>Start”菜单,运行测试计划。 1.6.4.查看运行监控指标 单击“ViewResultsinTable”...
5. **测试和调试**:在开发过程中,使用 Acegi 提供的工具进行测试和调试,确保安全策略的正确性。 然而,值得注意的是,Acegi 在后期已经被 Spring Security 所取代,Spring Security 是 Acegi 的继承者,提供了更...
在部署Spring Security之前,首先需要在web.xml中声明所需的上下文参数和监听器。 - **2.2.2. 最小配置** `<http>`标签是Spring Security配置中最常用的标签之一,它可以用来指定各种安全策略。最小配置通常包含...
总的来说,"Testautomation-with-Puppeteer" 是一个实践 Puppeteer 自动化测试的好例子,通过学习和理解这个项目,你可以掌握如何为客户端项目构建高效、可靠的浏览器自动化测试框架。同时,Puppeteer 的易用性和...
在配置LDAP域的单点登录时,我们以一个具体的例子来说明。假设公司内有一个AD域服务器,域名为123.com,IP地址为192.168.1.24。目标是让用户登录域后,通过AC设备自动认证上网,并将AD域中的"train"组织单元(OU)...
§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 在控制实用程序运行中设置...
5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...