news 2026/4/15 12:33:53

InitialDirContext这个是怎么使用的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
InitialDirContext这个是怎么使用的

InitialDirContext是 Java JNDI (Java Naming and Directory Interface) API 的核心类,用于访问目录服务(如 LDAP)。下面是详细的使用说明:

一、基本使用步骤

1.导入必要的包

import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.*; import java.util.Hashtable; import java.util.Properties;

2.创建环境配置

// 方式1:使用 Hashtable 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"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=example,dc=com"); // 管理员DN env.put(Context.SECURITY_CREDENTIALS, "password"); // 方式2:使用 Properties Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");

二、常用操作示例

1.创建连接

public DirContext createConnection() throws NamingException { Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "uid=user1,ou=people,dc=example,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "password"); return new InitialDirContext(env); }

2.搜索操作

public void searchLDAP(DirContext ctx) throws NamingException { // 设置搜索参数 String searchBase = "dc=example,dc=com"; String filter = "(&(objectClass=person)(uid=user1))"; SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); controls.setReturningAttributes(new String[]{"cn", "mail", "telephoneNumber"}); // 执行搜索 NamingEnumeration<SearchResult> results = ctx.search(searchBase, filter, controls); while (results.hasMore()) { SearchResult result = results.next(); Attributes attrs = result.getAttributes(); System.out.println("DN: " + result.getNameInNamespace()); System.out.println("CN: " + attrs.get("cn").get()); System.out.println("Mail: " + attrs.get("mail").get()); } }

3.添加条目

public void addEntry(DirContext ctx) throws NamingException { Attributes attrs = new BasicAttributes(); // 创建对象类 BasicAttribute objectClass = new BasicAttribute("objectClass"); objectClass.add("top"); objectClass.add("person"); objectClass.add("organizationalPerson"); objectClass.add("inetOrgPerson"); attrs.put(objectClass); // 添加属性 attrs.put("cn", "张三"); attrs.put("sn", "张"); attrs.put("uid", "zhangsan"); attrs.put("userPassword", "password123"); attrs.put("mail", "zhangsan@example.com"); // 创建条目 String dn = "uid=zhangsan,ou=people,dc=example,dc=com"; ctx.createSubcontext(dn, attrs); }

4.修改属性

public void modifyAttributes(DirContext ctx) throws NamingException { String dn = "uid=zhangsan,ou=people,dc=example,dc=com"; // 修改操作列表 ModificationItem[] mods = new ModificationItem[2]; // 替换属性 Attribute mod0 = new BasicAttribute("telephoneNumber", "1234567890"); mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0); // 添加属性 Attribute mod1 = new BasicAttribute("description", "新员工"); mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, mod1); ctx.modifyAttributes(dn, mods); }

5.删除条目

public void deleteEntry(DirContext ctx) throws NamingException { String dn = "uid=zhangsan,ou=people,dc=example,dc=com"; ctx.destroySubcontext(dn); }

三、完整示例

public class LDAPExample { public static void main(String[] args) { DirContext ctx = null; try { // 1. 创建连接 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"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=example,dc=com"); env.put(Context.SECURITY_CREDENTIALS, "admin123"); ctx = new InitialDirContext(env); System.out.println("连接LDAP服务器成功!"); // 2. 搜索用户 searchUsers(ctx); // 3. 添加用户 addUser(ctx, "lisi", "李四", "lisi@example.com"); } catch (NamingException e) { e.printStackTrace(); } finally { // 4. 关闭连接 if (ctx != null) { try { ctx.close(); } catch (NamingException e) { e.printStackTrace(); } } } } private static void searchUsers(DirContext ctx) throws NamingException { String searchBase = "dc=example,dc=com"; String filter = "(objectClass=person)"; SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration<SearchResult> results = ctx.search(searchBase, filter, controls); while (results.hasMore()) { SearchResult result = results.next(); System.out.println("找到用户: " + result.getName()); } } private static void addUser(DirContext ctx, String uid, String cn, String mail) throws NamingException { Attributes attrs = new BasicAttributes(); BasicAttribute objectClass = new BasicAttribute("objectClass"); objectClass.add("inetOrgPerson"); attrs.put(objectClass); attrs.put("uid", uid); attrs.put("cn", cn); attrs.put("sn", cn.substring(0, 1)); // 假设姓是第一个字符 attrs.put("mail", mail); String dn = "uid=" + uid + ",ou=people,dc=example,dc=com"; ctx.createSubcontext(dn, attrs); System.out.println("添加用户成功: " + cn); } }

四、常见配置参数

参数

说明

示例值

Context.INITIAL_CONTEXT_FACTORY

上下文工厂类

com.sun.jndi.ldap.LdapCtxFactory

Context.PROVIDER_URL

LDAP服务器地址

ldap://localhost:389

Context.SECURITY_AUTHENTICATION

认证方式

simple,none,GSSAPI

Context.SECURITY_PRINCIPAL

认证用户DN

cn=admin,dc=example,dc=com

Context.SECURITY_CREDENTIALS

认证密码

password

Context.REFERRAL

是否跟踪引用

follow,ignore

五、最佳实践

  1. 资源管理:确保在finally块中关闭连接

  2. 连接池:生产环境建议使用连接池

  3. 错误处理:适当处理NamingException

  4. SSL/TLS:生产环境使用LDAPS

  5. 超时设置:设置合理的连接和读取超时

六、Maven依赖

<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency>

注意InitialDirContext不仅用于LDAP,还可以用于其他目录服务,但LDAP是最常见的用例。实际使用时需要根据具体的LDAP服务器配置调整参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 23:03:52

利用RSS订阅扩大技术内容影响力范围

利用RSS订阅扩大技术内容影响力范围 在智能开发工具日新月异的今天&#xff0c;一个开发者最怕的不是写不出代码&#xff0c;而是错过了关键的技术更新。你是否曾遇到这样的情况&#xff1a;项目卡在某个依赖版本问题上苦思冥想&#xff0c;几天后才发现社区早已发布了对应的修…

作者头像 李华
网站建设 2026/4/14 18:33:09

华为OD机试 - 产品模块算法检验 - Tarjan算法(Python/JS/C/C++ 双机位C卷 200分)

华为OD机试双机位C卷统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)。 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释…

作者头像 李华
网站建设 2026/4/15 10:52:04

c++实现两个点一个宽度生成一个旋转矩形和计算旋转矩形的四个点坐标

从两个点和一个宽度生成旋转矩形 宽度┌───────────┐│ │ P1●─┼───────────┼─●P2 长度 |P1P2|│ │└───────────┘宽度矩形中心 P1和P2的中点矩形长度 |P1P2| (两点距离)矩形宽度 输入的width参数矩形角度…

作者头像 李华
网站建设 2026/4/15 10:34:11

Miniconda-Python3.10 + PyTorch安装避坑指南

Miniconda-Python3.10 PyTorch安装避坑指南 在深度学习项目中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是环境配置——明明代码没问题&#xff0c;却因为 ModuleNotFoundError 或 CUDA 版本不兼容卡住一整天。你有没有经历过这样的场景&#xff1a;刚接手一个开…

作者头像 李华
网站建设 2026/4/14 15:06:51

人人都是好朋友【牛客tracker 每日一题】

人人都是好朋友 时间限制&#xff1a;2秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每…

作者头像 李华
网站建设 2026/4/14 15:43:41

通过SSH设置跳板机访问内网Miniconda训练环境

通过SSH设置跳板机访问内网Miniconda训练环境 在高校实验室或企业AI研发团队中&#xff0c;一个常见的场景是&#xff1a;GPU服务器部署在内网深处&#xff0c;安全策略严格&#xff0c;无法直接从外部连接。而开发者又需要频繁登录进行模型调试、运行Jupyter Notebook、管理训…

作者头像 李华