The Application of Design Pattern in Accessing Process of JNDI
SHI Lei1, LIU Wei2
(1.Institute of Command Automation PLA University of Science and Technology, Nanjing 210007, China;
2.School of Computer Science, Nation University of Defense Technology, Changsha 410073, China)
Abstract: The Java Naming and Directory Interface (JNDI) offers application programming interface (API) to access the naming and directory service. It can improve exploitation efficiency. But developers still need to write different codes for different operations. Based on OO design principles, this paper taking LDAP directory service as an example, uses design patterns to contrive an access model of directory server that simplifies the access process. Bridge pattern avoids client to set the accessing parameters directly and adapts well to the new connecting methods; Command pattern encapsulates methods into command objects, then decouples the client class from the Request class.
Keywords: Naming and Directory server; Design pattern; Bridge pattern; Command pattern;
1 目录服务概述
近几年,随着LDAP(Light Directory Access Protocol,轻量级目录访问协议)技术的兴起和其应用领域的不断扩展,许多新型应用已经将目录服务技术作为实现信息存储、管理和查询的首选方案,特别是在网络资源查找、用户访问控制与认证信息查询、新型网络服务、网络安全、商务网通用数据库服务和安全服务等方面,都需要应用目录服务技术实现一个通用、完善、应用简单的和可扩展的系统。
图 1 目录服务组织结构
目录服务是按照树状模式组织信息,实现信息管理和服务接口的一种方法[1]。例如,图1表示一个公司的信息,其中dc=com表示公司的根节点,dc=fooware表示fooware公司。从根节点开始,树上的每个节点都可表示一个惟一实体,称为一个条目(Entry)。“uid=simon,ou=People,dc=fooware,dc=com”可以表示fooware软件公司的惟一员工simon。这样,用户可以在每个Entry上进行各种数据的绑定,例如员工年龄、电话号码等信息。可以说,目录服务为分布式数据存储和访问提供了一种高效、快捷的手段。
2 JNDI设计思想及原理
JNDI(Java Naming and Directory Interface:Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。JNDI使Java平台下的应用程序能够访问多个命名和目录服务器。这一层API将应用与实际数据源分离,因此不管应用访问的是 LDAP、RMI、CORBA、NDS,还是其他目录服务,都可以通过统一的API进行访问。它的体系结构如图2所示[2]。
图 2 JNDI体系结构
以LDAP服务器为例,使用JNDI访问LDAP服务器的开发过程包含下面三个步骤:
(1) 设置环境变量。首先创建一个哈希表env以存储用于连接目录服务器的环境变量,并指定JNDI的服务提供者和相应目录服务器的URL属性:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER_URL,
“ldap://localhost:389”);
(2) 绑定到服务器。使用哈希表env作为InitialDirContext构造函数的参数,JNDI底层将建立同目录服务器的连接,并返回标识该连接的引用值ctx:
DirContext ctx = new InitialDirContext(env);
(3) 发送服务请求。这一步将通过引用ctx对LDAP服务器进行各种操作,包括搜索、修改、添加和删除。例如,搜索图1中Entry:“uid=simon,ou=People,dc=fooware,dc=com”的objectclass属性,其代码如下:
//设置搜索起点
String MY_SEARCHBASE = “uid=simon,ou=People
dc=fooware,dc=com”;
//设置搜索过滤器
String MY_FILTER = “(objectclass= *)”;
//定义搜索控制器
SearchControls controls = new
SearchControls();
//进行搜索操作
NamingEnumeration results =
ctx.search(MY_SEARCHBASE,
MY_FILTER, controls);
通过以上代码可以看出,JNDI为程序员开发与访问目录服务器的相关应用提供了一致和标准,使用统一的API可以对不同的目录服务器进行操作。
3 设计模式下JNDI的访问模型
面向对象设计原则中的“开放—封闭原则(Open—Closed Principle)”指出,“软件实体对于扩展应该是开放的,但是对于更改是封闭的”[3]。这个原则的目标使用户在不用修改已有类代码的基础上,扩展类行为。但是,从JNDI访问目录服务的编码过程来看,这个过程并没有完全遵循这一设计原则。例如,如果需要以不同方式登录目录服务器,就需要修改客户端源代码,在(1)步骤中指定新的环境变量;其次,获取同LDAP服务的连接后,客户端可以向服务器发送不同的请求操作,但是,由于JNDI提供的标准接口与各种请求的操作细节紧密相关,使得每一步的请求细节与客户端代码相耦合,不利于代码修改。因此,作者在分析目录服务器客户程序的过程中,运用设计模式对JNDI访问目录服务器的过程做进一步抽象,以提高系统的灵活性和扩展性。
3.1 抽象的客户端访问目录服务器模型
从更加抽象的层次来理解,对目录服务器的访问可以简化为以下三个过程,如图3所示。
图 3 目录服务器访问模型
(1) 建立连接。这个步骤是以指定方式同目录服务器建立连接。连接方式是通过设置环境变量来指定,其中包括匿名连接、基本认证连接、SSL匿名连接和SSL认证连接等。
(2) 发送请求。这个步骤由客户端向服务器发出请求。它包括添加、删除、修改和查询等各种具体请求。
(3) 接受应答。客户端发出请求后,服务器将依照(2)中的请求进行处理,并将执行后相应的结果返回给客户端。
下面从该模型的这三个抽象层次出发,对访问目录服务器的过程进行改进。
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。