Java JNDI使用详解

    科技2026-04-23  5

    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目录服务相关操作的入口类,通过该类可进行目录相关服务的操作 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; 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");
    Processed: 0.008, SQL: 9