`
mengyang
  • 浏览: 266152 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

JNDI操作(转)

阅读更多
JNDI定义了一个Serializable接口类来为应用信息的表达提供一种统一的方式。Serializable接口类包含了诸如地址、类型信息等用于访问具体对象的信息。为了能将对象的引用绑定到目录树中,该对象的类必须实现Referenceable接口,其中包含了方法 getReference()。开发者可以在该对象上调用getReference()方法来获得Reference以用于绑定。Serializable接口与Referenceable接口有颇多相似之处,不同在于Referenceable可引用的对象只包含一些用于创建实际对象的信息,而Serializable会包含更多的甚至不适合存储在目录结构中的信息。

(2)绑定保存对象程序

package jndi;

import java.util.Hashtable;

import javax.naming.Context;

import javax.naming.NamingException;

import javax.naming.directory.*;

public class ldapDataBind {

public static void main(String[]args){

//创建Hashtable以存储JNDI将用于连接目录服务的环境变量

Hashtable hs = new Hashtable();

//设置连接LDAP的实现工厂

hs.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.ldap.LdapCtxFactory");

// 指定LDAP服务器的主机名和端口号

hs.put(Context.PROVIDER_URL, "ldap://localhost:389 ");

//给环境提供认证方法,有SIMPLE、SSL/TLS和SASL

hs.put(Context.SECURITY_AUTHENTICATION, "simple");

//指定进入的目录识别名DN

hs.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");

//进入的目录密码

hs.put(Context.SECURITY_CREDENTIALS, "password");

try {

// 得到初始目录环境的一个引用

DirContext ctx = new InitialDirContext(hs);

// 新建一个对象

persons perObj = new persons("jordan","40");

//绑定对象

ctx.rebind ("uid = Jordan,ou = Bull,o = NBA ",perObj);

System.out.println("bind object object success " );

/*实例化一个属性集合*/

Attributes attrs = new BasicAttributes(true);

/*建立一个属性,其属性名为"mail"*/

Attribute personMail = new BasicAttribute("mail");

//设置属性"mail"的值为"xie@163.com"、"liu@sina.com.cn"、
"xyh@powerise.com.cn"

personMail.add("xie@163.com");

personMail.add("liu@sina.com.cn");

personMail.add("xyh@powerise.com.cn");

attrs.put(personMail);

/*建立一个属性,其属性名为"uid",值为001*/

attrs.put("uid","001");

/*建立一个属性,其属性名为"cn",值为jordan1*/

attrs.put("cn","jordan1");

/*建立一个属性,其属性名为"sn",值为NBA */

attrs.put("sn","NBA");

/*建立一个属性,其属性名为"ou",值为bull */

attrs.put("ou","bull");

System.out.println("bind object object success " );

/* 在识别名为DN的目录中增加一个条目*/

ctx.createSubcontext("uid = Jordan, ou = Wizzard,o=NBA",attrs);

//关闭初始目录环境

ctx.close();

} catch (NamingException ex) {

System.err.println("bind object fail: " + ex.toString());

}

}

}

2.使用JNDI查找数据

前面已经介绍了怎么样将对象数据绑定到服务器,现在开始介绍如何取得调用绑定在服务器上的对象数据。

5 例6-2 使用JNDI查找数据。

要调用对象数据,首先就必须用JNDI查找绑定的对象和数据,查找出来后,再调用该对象。程序如下所示。

package jndi;

import java.nutil.Hashtable;

import javax.naming.Context;

import javax.naming.NamingException;

import javax.naming.NamingEnumeration;

import javax.naming.directory.*;

public class findUseBindObj {

public static void main(String[]args){

//创建Hashtable以存储JNDI将用于连接目录服务的环境变量

Hashtable hs = new Hashtable();

//设置连接Ldap的实现工厂

hs.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.ldap.LdapCtxFactory");

// 指定LDAP服务器IP地址为本机及端口号为389

hs.put(Context.PROVIDER_URL, "ldap://localhost:389");

try {

// 得到初始目录环境的一个引用

DirContext ctx = new InitialDirContext(hs);

//利用lookup查找返回指定DN的条目对象

persons pers =(persons)ctx.lookup("uid=Jordan,ou=Bull,o=NBA");

// 利用远程对象调用远程方法,返回Age变量的值

String age = pers.getAge();

// 利用远程对象调用远程方法,返回Name变量的值

String name = pers.getName();

//输出Name的值

System.out.println("name is :" + name );

/*根据结点的DN来查找它的所有属性, 然后再从属性中得到所有的值,注意一个属性可
以有多个值*/

Attributes attrs=ctx.getAttributes("uid=Jordan,ou=Wizzard,o=NBA");

//循环获取并输出这个属性的所有属性值

for(NamingEnumeration ae = attrs.getAll();ae.hasMore();){

//获取一个属性

Attribute attr = (Attribute)ae.next();

System.out.println("Attribute : " + attr.getID());

//循环取得输出这个属性的所有属性值

for(NamingEnumeration ve = attr.getAll();ve.hasMore();){

System.out.println(" Value : " + ve.next());

}

}

//成功打印提示信息

System.out.println("find object success " );

//调用该对象的函数

pers.toString();


//关闭初始目录环境

ctx.close();

} catch (NamingException ex) {

System.err.println(ex.toString());

}

}

}

对于作为引用绑定在目录树中的对象,JNDI SPI 指定针对引用创建实际的对象。因此,在程序中只需要认为用lookup()方法返回的对象就是实际对象,而不用在调用什么方法来将引用转换为实际对象了,因为所有的工作都由JNDI内部完成了。

6.2.7 JNDI查询修改LDAP目录条目
前面已经介绍了如何在LDAP服务器里存储一个对象:主要是利用一个DN将对象绑定到LDAP服务器中,然后用lookup(DN)查找定位到绑定的对象,再对该对象进行操作。但是往往使用DN查找非常难,用户很难记住DN,因此我们可以使用其他属性(比如CN=Cherry)来检索包含那个属性的条目。下面来介绍JNDI中相关属性检索的具体使用。

1.修改条目

很多时候可能要对LDAP服务器上的条目进行修改,如修改用户密码,更新应用的配置等。但修改必须由一个已认证过的用户来执行,而且通常只能修改自己的密码而不能修改其他信息,管理助手能够修改电话号码和邮件地址,而修改用户标识这种工作由数据库管理员完成。

6 例6-3 用JNDI修改LDAP条目。

package jndi;

import java.nutil.Hashtable;

import javax.naming.Context;

import javax.naming.directory.Attribute;

import javax.naming.directory.Attributes;

import javax.naming.directory.BasicAttribute;

import javax.naming.directory.DirContext;

import javax.naming.directory.InitialDirContext;

import javax.naming.directory.ModificationItem;

public class jndiPropertyModify {

public static void main(String[] args){

Hashtable hs = new Hashtable();

//设置连接LDAP的实现工厂为com.sun.jndi.ldap.LdapCtxFactory

hs.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.
LdapCtxFactory");

//指定提供服务的服务器IP地址和端口号

hs.put(Context.PROVIDER_URL,"ldap://localhost:389");

//使用简单认证来认证用户

hs.put(Context.SECURITY_AUTHENTICATION,"simple");

hs.put(Context.SECURITY_PRINCIPAL,"uid=Jordan,ou=Bull,o=NBA");

hs.put(Context.SECURITY_CREDENTIALS,"good");

try {

/*指定了JNDI服务提供者中工厂类(factory class)的名称。Factory负
责为其服务创建适当的InitialContext对象。在上面的代码片断中,为文件
系统服务提供者指定了工厂类*/

DirContext ctx = new InitialDirContext(hs);

System.out.println("成功创建初始化context对象!");

//新建生成一个修改条目类对象,用于存放条目属性

ModificationItem[] mdi = new ModificationItem[2];

// 把属性mail的值置为jordan@163.com

Attribute att0 = new BasicAttribute("mail",
"jordan@163.com");

// 把属性call的值置为12745827

Attribute att1 = new BasicAttribute("call","12745827");

//修改指定属性mail

mdi[0]=new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
att0);

//增加新属性call到条目

mdi[1]=new ModificationItem(DirContext.ADD_ATTRIBUTE,att1);

// 修改指定DN条目的属性

ctx.modifyAttributes("uid=Jordan,ou=Bull,o=NBA",mdi);

}catch(Exception ex ){

ex.printStackTrace();

System.exit(1);

}

}

}

上面程序的作用是修改前面例子中增加的DN为uid = Jordan,ou = Bull,o = NBA条目的属性。

在程序中用DirContext.REPLACE_ATTRIBUTE来修改条目的mail属性,在这里如果原来的mail属性有多个值时,都会被删掉,取而代之的是新赋的值。用DirContext. REPLACE_ATTRIBUTE时,如果原来的属性(mail)不存在时,就增加一个属性,有则修改。

用DirContext.ADD_ATTRIBUTE来将一个新属性增加到条目。真正起到修改作用的是ctx.modifyAttributes("uid = Jordan,ou = Bull,o = NBA",mdi)这条语句。

2.删除条目

有时,当开发者不需要某个条目时,就可以把它从LDAP服务器上删除。这只要通过调用参数为指定DN条目的DirContext接口的destorySubContext()方法来完成。

7 例6-4 用JNDI删除LDAP条目。

package jndi;

import java.nutil.Hashtable;

import javax.naming.Context;

import javax.naming.directory.Attribute;

import javax.naming.directory.Attributes;

import javax.naming.directory.BasicAttribute;

import javax.naming.directory.DirContext;

import javax.naming.directory.InitialDirContext;

import javax.naming.directory.ModificationItem;

public class jndiPropertyModify {

public static void main(String[] args){

Hashtable hs = new Hashtable();

//设置连接LDAP的实现工厂为com.sun.jndi.ldap.LdapCtxFactory

hs.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.
LdapCtxFactory");

//指定提供服务的服务器IP地址和端口号

hs.put(Context.PROVIDER_URL,"ldap://localhost:389");

//使用简单认证来认证用户

hs.put(Context.SECURITY_AUTHENTICATION,"simple");

// 指定DN

hs.put(Context.SECURITY_PRINCIPAL,"uid=Jordan,ou=Bull,o=NBA");

// 指定认证密码

hs.put(Context.SECURITY_CREDENTIALS,"good");

try {

/*指定了JNDI服务提供者中工厂类(factory class)的名称。Factory负
责为其服务创建适当的InitialContext对象。在上面的代码片断中,为文件
系统服务提供者指定了工厂类*/

DirContext ctx = new InitialDirContext(hs);

//删除指定DN条目

ctx.destroySubcontext("uid=Jordan,ou=Bull,o=NBA");

}catch(Exception ex ){

ex.printStackTrace();

System.exit(1);

}

}

}
分享到:
评论

相关推荐

    jndi-tool JNDI服务利用工具

    它允许程序查找和操作存储在不同类型的命名或目录服务中的对象,如 LDAP(Lightweight Directory Access Protocol)和RMI(Remote Method Invocation)。在Java应用中,JNDI通常用于查找资源,例如数据库连接池、...

    JNDI代码样例

    在Java世界中,JNDI(Java Naming and Directory Interface)是一种标准API,它允许应用程序查找和操作各种命名和目录服务,比如LDAP、DNS或者EJB等。本示例将聚焦于如何利用JNDI来调用CS(Client-Server)架构中的...

    Jndi.pdf

    - **转介**:当客户端请求的对象不在当前上下文中时,JNDI 可以自动转至其他上下文进行查找。 2. **`javax.naming.directory` 包** - **目录对象**:包括 `DirContext` 接口,扩展了 `Context` 的功能。 - **...

    java 采用JNDI访问数据库(三种方法)

    Java 通过JNDI(Java Naming and Directory Interface)访问数据库是一种常见的做法,它提供了一种标准的方法来查找和管理资源,如数据源、EJB、邮件服务器等。JNDI在企业级应用中广泛使用,因为它允许应用程序与...

    kettler连接oracle 12c数据库(目前只能用JNDI)

    具体操作如下: 1. **启动 Spoon 控制台** - 在 Kettler 安装目录中找到 `spoon.sh` 或 `spoon.bat` 文件并运行它。 - 启动 Spoon 控制台后,选择“连接”选项卡,并输入之前配置的 JNDI 数据源名称。 2. **...

    EJB中JNDI的使用源码例子

    - **初始化JNDI上下文**:创建`InitialContext`对象,这是所有JNDI操作的起点。通常需要设置一些环境属性,如`java.naming.factory.initial`和`java.naming.provider.url`,以指定命名和目录服务的实现。 - **查找...

    apache jndi 组件

    Apache JNDI(Java Naming and Directory Interface)组件是Java平台上的一个标准接口,它允许Java应用程序查找和操作各种命名和目录服务。JNDI的主要作用是提供了一个统一的API,使得开发者可以透明地访问多种不同...

    JNDI连接数据库配置

    具体操作是在`$CATALINA_HOME/webapps`目录下创建一个名为`jndi`的文件夹,然后将编译好的`.class`文件放置于此文件夹内的`WEB-INF/classes`目录下。 #### 四、配置JNDI资源 为了让上述Servlet能够成功地从JNDI中...

    providerutil.jar dns.jar jndi.jar

    `jndi.jar` 包含了运行JNDI应用所需的类和资源,包括服务查找、对象绑定和解绑、命名上下文操作等功能。 标签"providerutil"、"dns"和"jndi"进一步强调了这些库的核心功能。`providerutil` 关联于服务提供者的管理...

    基于Java的实例源码-EJB中JNDI的使用源码例子.zip

    在"codefans.net"这个文件中,可能包含了完整的Java源代码示例,展示了如何在实际项目中使用JNDI查找和操作EJB。通过对这些源码的阅读和理解,开发者可以更好地掌握EJB和JNDI在Java EE环境中的实际运用,提升开发...

    JNDISPI.pdf

    ### Java Naming and Directory Interface (JNDI) Service Provider Interface (SPI) #### 1. 引言 本文档主要介绍Java Naming and Directory Interface (JNDI) Service Provider Interface (SPI)的相关概念和技术...

    jndi.jar+dns.jar+providerutil.jar(java模式中提到的)

    JNDI的核心概念包括名称上下文(Name Context)和查找操作。通过JNDI,开发者可以透明地访问不同的命名和目录服务,如LDAP、DNS、RMI注册表等,而无需了解它们的具体实现细节。`jndi.jar` 包含了实现JNDI功能所需的...

    帆软报表FineReport中数据连接之Websphere配置JNDI连接

    在帆软报表FineReport中,若要实现与Websphere应用服务器的JNDI连接,需要进行一系列配置,以确保报表能够利用JNDI获取数据源,并最终在WEB环境中通过浏览器访问报表。 首先,需要了解JNDI(Java Naming and ...

    LDAP之JNDI修改条目密码

    JNDI(Java Naming and Directory Interface)是Java平台的一个接口,它允许Java应用程序访问各种命名和目录服务,包括LDAP。在本主题中,我们将深入探讨如何使用JNDI来修改OpenLDAP条目的密码,特别是涉及到MD5和...

    Webshpere配置JNDI数据源[归纳].pdf

    确认后,转到“数据源”部分进行配置。 在数据源配置中,需要设置连接池参数,如最小和最大连接数。这些值可以根据应用的预期负载和数据库的并发处理能力来设定。通常,为了保持性能和资源的有效利用,最小连接数和...

    commons.collections-3.2.1和commons-beanutils-1.9.2和commons.collections-3.2.1

    1. **集合转换**:可以将一个集合转换成另一种集合类型,如List转Set或Map。 2. **迭代器增强**:提供了一些迭代器的扩展,比如反向迭代、过滤迭代等。 3. **工厂方法**:创建集合、映射和迭代器的工厂,简化代码...

    Java-SVG转图片所需jar包

    标题所提及的"Java-SVG转图片所需jar包"是用于解决这个问题的关键组件。描述中指出,这个压缩包包含了14个jar文件,这些文件提供了必要的API和工具来处理SVG到图片的转换。 首先,我们来看一下关键的几个jar包: 1...

    ncnt.rar_M3V_ajax_blanketsts_drovepv6_personal

    2. `JndiTemplate.class`:这是Spring中用于执行JNDI操作的模板类,它封装了JNDI查找、绑定、解绑等操作,使得代码更易读和管理。 3. `JndiLocatorSupport.class` 和 `S1JndiLocatorDelegate.class`:这些类可能是...

    一个简单实用的数据库操作框架

    - `public Database(String datasource)`:当使用JNDI数据源时,可以通过这个构造函数初始化 `Database` 对象,这种方式更加适合企业级应用环境。 - **关键方法**: - `public Connection getConnection() throws...

Global site tag (gtag.js) - Google Analytics