再谈jndi

       在以前的blog中我曾谈到了jndi,在最近的学习中发现还是有些对jndi的新的见解的地方需要探讨。 

       我们知道jndi是java的命名和目录服务的api,为什么要有它了,是因为我们在网络条件下可能要查找和使用一些分布式的资源。好比我们现在使用的操作系统,它本身有一个类似于jndi的东西,这样我们才能找到和存放一些资源,如文件等。例如windows系统的分区和目录,它就是一个目录服务,还有linux的以文件夹的方式也是相当于一个目录服务;DNS就是一个命名服务等等,这些应用都有jndi的影子。考虑在网络条件下,我们要查找一个资源,我们不知道它所在的机器是什么操作系统,采用的什么目录和命名模式,所以sun提供了一个更高层次的接口,即jndi,让我们查找和使用资源是忽略这些不同的地方。否则试想一下以windows的目录结构试着去匹配linux的目录结构肯定是不行的。

      sun给的jndi只是个接口,各家都有自己的实现,这些实现就包括了一个统一的目录结构和查找(包括索引)。sun本身的jdk给了4种实现,还包含另一种简单的以文件系统为命名服务的实现。

     通常我们在程序中new出Context(在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的)需要提及做些工作(如果是在j2ee容器中的代码则不必),需要两步,一是实现类的initcontextfactory,另一个就是provider_url,它我感觉相当于给出具体资源在什么位置,并且以什么协议的形式作为其目录方案。有了这两个我们就能new出context,然后lookup出资源。以文件系统为命名服务的更简单,它只须一个factory就可以了。

<think>嗯,用户想了解JNDI的使用指南和示例。首先,我需要回顾一下JNDI的基础知识,确保自己理解正确。JNDI是Java的命名和目录接口,提供统一的API来访问不同的命名和目录服务,比如LDAP、DNS等。用户可能想知道如何在实际项目中配置和使用JNDI,特别是具体的代码示例。 首先,我应该解释JNDI的核心概念,比如Context、InitialContext、绑定和查找。这些是使用JNDI时的基本元素。然后,给出一个简单的示例,展示如何绑定对象到上下文,再从上下文中查找对象。代码部分需要用Java,并且要确保语法正确,可能需要使用InitialContext类。 接下来,用户可能需要了解如何连接不同的目录服务,比如LDAP。这部分需要提供一个连接LDAP的配置示例,说明如何设置环境属性,并进行查找操作。要注意到不同的服务有不同的配置参数,比如连接URL、安全认证等。 另外,用户可能关心JNDI在Java EE中的应用,比如数据源的配置。这里需要提到如何在应用服务器中配置JNDI数据源,并在代码中获取连接。这部分对开发Web应用特别有用,比如使用Tomcat或WildFly服务器。 然后,生成相关问题的时候,要覆盖常见的使用场景、配置参数、安全性、与Spring集成以及异常处理。这些问题可以帮助用户更深入地了解JNDI的不同方面,解决实际开发中可能遇到的问题。 需要注意的是,用户提供的引用中有提到JNDI的独立于具体目录服务的实现,所以在回答时要强调其跨服务的特性。同时,确保示例代码正确,比如使用正确的JNDI API,处理NamingException异常,以及正确关闭资源。 最后,检查回答是否符合系统级指令:行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以主要关注代码格式和引用标记。确保引用标识正确添加,比如[^1]和[^2]对应的参考资料。</think>### Java Naming and Directory Interface (JNDI) 使用指南 #### 1. 核心概念 JNDI 是 Java 平台中用于统一访问命名和目录服务的 API,支持 LDAP、DNS、RMI 等多种服务[^2]。其核心接口为: - `Context`:表示命名上下文,提供绑定/查找操作 - `InitialContext`:访问命名系统的入口点 - `Name`:表示复合名称的接口 #### 2. 基础使用示例 ```java // 初始化上下文 Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:/tmp/jndi"); Context ctx = new InitialContext(env); // 绑定对象 ctx.bind("java:comp/env/jdbc/mydb", myDataSource); // 查找对象 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mydb"); ``` #### 3. LDAP 目录服务操作 ```java // 配置 LDAP 连接 Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/dc=example,dc=com"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=admin"); env.put(Context.SECURITY_CREDENTIALS, "password"); DirContext ldapCtx = new InitialDirContext(env); // 查询条目 Attributes attrs = ldapCtx.getAttributes("uid=john"); String mail = (String) attrs.get("mail").get(); ``` #### 4. JNDI 数据源配置(以 Tomcat 为例) 在 `context.xml` 中配置: ```xml <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" maxTotal="20" username="dbuser" password="dbpass" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb"/> ``` #### 5. 最佳实践 1. 使用连接池管理资源 2. 通过 JNDI 环境变量分离配置 3. 采用 try-with-resources 确保上下文关闭 4. 对敏感信息(如 LDAP 凭证)使用加密存储
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值