jndi,就是命名服务(n:naming)和目录服务(d:directory).
命名服务:把对象映射到方便记忆的名字的机制.可以通过域名系统dns来理解,例如我们访问百度,只要输入www.baidu.com而不是百度的IP地址.
目录服务:其实也是一种命名服务,为一组对象或数据值提供一个结构.
为什么要使用jndi呢??答:使java应用程序访问企业的各种资源(打印机,服务器,数据库等之间的协调工作)
使用jndi必须有jndi库和至少一个服务提供者
举例:(myelcipse jdk1.6)
1)文件系统提供者FsContext
(下载地址:http://java.sun.com/products/jndi/index.html)
将fscontext.jar包加到项目的classpath下,下面的代码演示了javax.naming包定义的Context接口的list方法,检索当前上下文(本例以:项目根目录/tmp/marketing)中的对象.
import java.util.Hashtable;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;public class List {
public static void main(String args[])
{
Hashtable env = new Hashtable();
//java.naming.factory.initial 初始上下文工厂类名
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.FSContextFactory");
//java.naming.provider.url 为提供者声明配置信息
env.put(Context.PROVIDER_URL, "file:/tmp/marketing");
try
{
Object item = null;
//创建一个InitialContext对象
Context initCtx = new InitialContext(env);
//返回一个在给定上下文中的名字及其所绑定对象的类名的NamingEnumeration 对象
NamingEnumeration nl = initCtx.list("reports");
System.out.println("*****Printing context list ******");
if(nl == null)
{
System.out.println("\nNo items in name list");
}
else
{
while(nl.hasMore())
{
item = nl.next();
System.out.println("item's class is "+item.getClass().getName());
System.out.println(item);
System.out.println("");
}
}
System.out.println("****Printing context list bindings ***");
nl = initCtx.listBindings("reports");
if(nl == null)
{
System.out.println("\nNo items in name list");
}
else
{
while(nl.hasMore())
{
item = nl.next();
System.out.println("item's class is "+item.getClass().getName());
System.out.println(item);
System.out.println("");
}
}
}
catch(Exception e)
{
System.out.println(e);
e.printStackTrace(System.out);
}
}
}2)LDAP(轻量级目录访问协议,windows环境):
a.首先得安装openldap.exe
b.安装目录(默认c:/openldap)下找到slapd.conf
(1)将 include C:/openldap/etc/schema/cosine.schema
include C:/openldap/etc/schema/inetorgperson.schema加到其include语句下面
(2)找到suffix和rootdn,将其内容改为
suffix "o=tcl,c=cn"
rootdn "cn=Manager,o=tcl,c=cn"
(3)启动openldap服务,打开dos命令:
C:\> cd \openldap
C:\openldap> .\slapd -d 1
(4)加入ldap.jar包到classpath下
(5)示例代码:
import javax.naming.*;
import javax.naming.directory.*;import java.util.Enumeration;
import java.util.Hashtable;public class DirectoryExample {
public static void main(String[] args) {
String root = "o=tcl,c=cn"; // root
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,o=tcl,c=cn");
env.put(Context.SECURITY_CREDENTIALS, "secret");
DirContext ctx = null;
try {
ctx = new InitialDirContext(env);
System.out.println("认证成功");
} catch (javax.naming.AuthenticationException e) {
e.printStackTrace();
System.out.println("认证失败");
} catch (Exception e) {
System.out.println("认证出错:");
e.printStackTrace();
}
if (ctx != null) {
try {
ctx.close();
} catch (NamingException e) {
// ignore
}
}}
}
jndi学习总结
最新推荐文章于 2022-03-25 20:45:11 发布