jndi学习总结

 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
   }
  }

 }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值