什么是命名和目录服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是命名和目录服务相关的知识,希望对你有一定的参考价值。

参考技术A JNDI:命名和目录服务
stringpropertiesjavacredentialsinterfaceapi
主要内容
-JNDI介绍
-JNDI架构
-包结构
-JNDI上下文
-JNDI的使用
-JNDI实例
2.1 JNDI介绍
——Java命名和目录接口(Java Naming and Directory Interface,JNDI)是一组在Java应用中访问命名和
目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在
这种服务里,对象不但有名称,还有属性。
——命名和目录服务用于在分布式计算环境中共享资源,用户在不清楚资源具体位置的情况下,依靠这种服务机制
可以获取和使用资源。
——JNDI允许服务器按照指定的名字处置对象,远程客户机可以检索JNDI服务,获得一个对指定对象的引用。JNDI
最简单的形式就是用来查找通过Java EE 5服务器注册的资源。
命名服务
——命名服务作为一种基础设施出现在众多的计算机系统,其意义在于提供根据名称关联对象和通过对象匹配相应
名称的服务。命名服务允许你通过名称找到一个与之对应的对象。
——一个命名服务的主要功能就是把一个人类容易理解的名字映射到相应的对象。举例来说,Internet域名系统(
DNS)把机器名字(例如www.sun.com)映射到IP地址(192.9.48.5)。一个文件系统把一个文件名(例如c:/
bin/autoexec.bat)映射到一个文件句柄以便程序能够存取文件的内容。
目录服务
——目录服务是命名服务的自然扩展。两者之间的主要差别是目录服务中对象可以有属性(例如,用户有email地址),
而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,
定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。
2.2 JNDI架构
JNDI架构提供了一组标准的独立于命名系统的API,这些API构件在于命名系统有关的驱动之上。这一层有助于将应用
与实际数据源分离,而不用理会应用访问的是LDAP,RMI,DNS,还是其他的目录服务。换句话说,JNDI独立于目录服务
的具体实现,只要你有目录的服务提供接口(或驱动),你就可以使用目录服务。

Java应用程序
---------------
JNDI应用编程接口
------------------
命名和目录管理器
----------------------
服务提供者接口(SPI)
--------------------------

Weblogic JNDI树|LDAP|RMI|DNS|......

2.2 JNDI架构
JNDI提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider
interface,SPI).这一点的真正含义是,要让你的应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,
这正是JNDI SPI发挥作用的地方。服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些
类为各种具体的命名和目录服务实现了JNDI接口-很像JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为

一个应用开发者,你不必操心JNDI SPI。你只需要确认你要使用的每一个命名或目录服务都有服务提供者。
2.3 包结构
——JNDI包含在Java SE平台中。要使用JNDI,您必须有JNDI的类和至少一个服务提供者。JDK 1.3及以上的版本包
含了JNDI,支持以下服务:
1.LDAP(Lightweight Directory Access Protocol)服务提供者
2.CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服务提供

3.RMI(Java Remote Method Invocation)注册服务提供者
4.DNS(Domain Name System)服务提供者
2.3 包结构
更多的服务提供者可以在如下网址找到可以下载的服务提供者列表:
http://java.sun.com/products/jndi/serviceproviders.html 特别有意思的或许是如下网址提供的Windows 注册表JNDI服务提供者:
http://cogentlogic.com/cocoon/CogentLogicCorporation/JNDI.xml 这个服务提供者使你可以访问Windows XP/2000/NT/Me/9x的windows注册表。也可以在如下网址下载JNDI/LDAP Booster Pack:
http://java.sun.com/products/jndi/ 这个Booster Pack包含了对流行的LDAP控制的支持和扩展。它代替了与LDAP 1.2.1服务提供者捆绑在一起的booster pack。
关于控制和扩展的更多信息可以在如下网站看到: http://java.sun.com/products/jndi/tutorial/ldap/ext/index.html
另一个有趣的服务提供者是Sun的支持DSML v2.0(Directory Service Markup Language,目录服务标记语言)的服务提供者。DSML的目的是在目录服务和XML之间架起一座桥梁。
2.3 包结构
JNDI API由5个包组成:
  1、Javax.naming:包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。
  2、Javax.naming.directory:对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。
  3、Javax.naming.event:提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。
  4、Javax.naming.ldap:这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。
  5、Javax.naming.spi:这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。
2.4 JNDI上下文
java.naming包中定义了Context接口,这是查询、binding/unbinding、重命名对象,以及创建和删除子上下文的核心接口。 
命名服务将名称和对象联系起来。这种联系称之为绑定(binding)。一组这样的绑定称之为上下文(context),上下文提供了解析(即返回对象的查找操作)。其他操作包括:名称的绑定和取消绑定,列出绑定的名称。

lookup
最常用的操作是look()。您为lookup()提供想要查找的对象名,它返回绑定到这个名称的对象。
bindings
listBindings()返回名-对象绑定的枚举。一个绑定是一个三元组,包含绑定对象的名称、对象的类名以及对象本身。
List
list()和listBindings()类似,但它返回的名称枚举包含对象名和对象的类名。list()对于想要浏览上下文中绑定对象的信息,但不想得到实际的对象这类应用程序很有用。即使listBindings()提供所有相同的信息,但这是一个很昂贵的操作。
Name
Name是一个代表一般名称的接口,零个或多个组件的有序列表。命名系统使用这个接口定义名称,这些名称遵循名称和目录概念一节中的约定。
References
使用不同的方式保存在命名和目录服务中的对象。引用是对象的十分简单的代表。
JNDI定义了表示引用的引用类。引用包含了如何创建对象副本的信息。JNDI尝试将目录中查找到的对象应用转化成它所代表的Java对象,所以JNDI客户端有保存在目录中的是实际的Java对象这种假象。

2.5 JNDI的使用
-创建初始上下文环境
Context ctx=new InitialContext();
-JNDI对象绑定
String s=“Test String”;
ctx.bind(“Chapter2”,s);
-JNDI对象的重新绑定
ctx.rebind(“Chapter2”,s);
-删除JNDI对象
ctx.unbind(“Chapter2”);
-查找名字服务中某个对象的引用
String s=(String)ctx.lookup(“Chapter2”);

2.6 JNDI 实例
简单实例:
-将一个String对象绑定到名字“name”上,并给其赋值为JNDI Test example,然后将其输出。
-给name重新赋值为welcome to you,再将其输出。

public class JNDIDemo

public static void main(String[] args)

Context ctx=null;
Properties p=new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL,"t3://localhost:7001");
try
ctx=new InitialContext(p);
String test="JNDI Test example";
ctx.bind("name",test);
String s=(String)ctx.lookup("name");
System.out.println(s);
String str="welcome to you ";
ctx.rebind("name",str);
s=(String)ctx.lookup("name");
System.out.println(s);

catch(NamingException e)

System.out.println(e.toString());




附加安全验证的实例
客户机在创建InitialContext时,通过在属性值中加入两个属性来设置用户名和密码。
Properties p=new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL,"t3://localhost:7001");
//下面的内容是为了验证用户身份而设置的
p.put(Context.SECURITY_PRINCIPAL,"maly");//用户名maly
p.put(Context.SECURITY_CREDENTIALS,"12345678");//密码12345678

END本回答被提问者和网友采纳

JNDI和三层架构

1.JNDI是什么:

JNDI(Java Naming and Directory Interface)是一个有关应用程序设计的API,为开发人员提供了查找和访问各种命名目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。

2.JNDI可访问的现有的目录及服务有:

DNS、文件服务 、数据库 目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

3.JNDI的简单实用:

3.1Tomcat根目录\conf\context.xml文件为全局上下文配置文件,对所有的Web应用有效,所以发布的信息配置在此文件中,再通过JNDI来查找信息。

3.2可以在context.xml文件添加以下:

<Context>

<Environment name="jndi/name" value=" hello JNDI " type="java.lang.String"/>

</context>

4.三层架构中的三层是指:

 

1:数据访问层:

主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务.

2:业务逻辑层:

主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

3:表示层:

主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。

 

以上是关于什么是命名和目录服务的主要内容,如果未能解决你的问题,请参考以下文章

jndi 原理

JNDI(Java Naming and Directory Interface,Java命名和目录接口)

JNDI

jndi是啥

什么是虚拟目录

包含了访问命名服务的类和接口