Java JNDI使用详解

JNDI基本介绍

JNDI(Java Naming and Directory Interface–Java命名和目录接口)是Java中为命名和目录服务提供接口的API,通过名字可知道,JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。

JNDI架构图

JNDI主要由JNDI API和JNDI SPI两部分组成,Java应用程序通过JNDI API访问目录服务,而JNDI API会调用Naming Manager实例化JNDI SPI,然后通过JNDI SPI去操作命名或目录服务其如LDAP, DNS,RMI等,JNDI内部已实现了对LDAP,DNS, RMI等目录服务器的操作API。
在这里插入图片描述

JNDI核心API

类名描述
Context命名服务的接口类,由很多的name-to-object的健值对组成,可以通过该接口将健值对绑定到该类中,也可通过该类根据name获取其绑定的对象
InitialContextNaming(命名服务)操作的入口类,通过该类可对命名服务进行相关的操作
DirContextDirectory目录服务的接口类,该类继承自Context,在Naming服务的基础上扩展了对于对象属性的绑定和获取操作
InitialDirContextDirectory目录服务相关操作的入口类,通过该类可进行目录相关服务的操作
  1. Context核心方法
/**可根据Name实现类或者字符串name去获取绑定在context中的对象**/
 public Object lookup(Name name) throws NamingException;
 public Object lookup(String name) throws NamingException;
 
/**可使用Name实现类或者字符串name将对象绑定到Context中*/
 public void bind(Name name, Object obj) throws NamingException;
 public void bind(String name, Object obj) throws NamingException;
  1. DirContext核心方法
/**可根据Name或者name获取绑定对象的所有已关联的属性*/
 public Attributes getAttributes(Name name) throws NamingException;
 public Attributes getAttributes(String name) throws NamingException;

/**可根据Name或者name和属性标识符id相关联的属性/
public Attributes getAttributes(Name name, String[] attrIds)
            throws NamingException;
 public Attributes getAttributes(String name, String[] attrIds)
            throws NamingException;

/**将Name和Object绑定起来,同时将属性关联到相应的对象上去*/
public void bind(Name name, Object obj, Attributes attrs)
            throws NamingException;
public void bind(String name, Object obj, Attributes attrs)
            throws NamingException;

JNDI操作目录服务代码编写

下面会以通过JNDI API去访问Sun的LDAP为实例
1.为初始化上下文选择服务提供者

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");

2.提供初始化上下文需要的信息

env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:389");
env.put(Context.SECURITY_PROTOCOL, "plain");
env.put(Context.SECURITY_PRINCIPAL, "admin");
env.put(Context.SECURITY_CREDENTIALS, "admin");

3.创建初始化上下文

InitialDirContext ctx = new InitialDirContext(env);

4.查询对象

Object obj = ctx.lookup("cn=zhangsan,ou=People");

版权声明:本文为qinwuxian19891211原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。