news 2026/6/9 20:03:47

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/6/8 15:22:01

CSS3 圆角

CSS3 圆角 在网页设计中,CSS3 的圆角功能为网页元素提供了丰富的视觉表现力。通过使用 CSS3,开发者可以轻松地为矩形框、图像、按钮等元素添加圆角效果,从而提升整个页面的美观度。本文将详细讲解 CSS3 圆角的相关知识,包括其应用场景、语法规则以及一些高级技巧。 一、应…

作者头像 李华
网站建设 2026/6/9 15:05:12

Adams中机械系统动态质心实时显示与质心轨迹导出

在ADAMS软件中&#xff0c;‌Aggregate Mass‌功能用于计算并显示模型中选定部件或整个系统的总质量、质心位置以及转动惯量等质量特性&#xff0c;该工具对于验证模型准确性、检查惯性参数以及进行动力学分析至关重要。‌ 但通过Aggregate Mass‌功能计算的是系统静态的质心位…

作者头像 李华
网站建设 2026/6/9 15:08:18

10 数据抽取 - 文档类型检测

文章目录文档类型识别filetype 文件类型识别库特点支持类型API 接口filetype 模块guess(obj)&#xff1a;guess_mime(obj)&#xff1a;guess_extension(obj)&#xff1a;get_type(mimeNone, extNone)&#xff1a;add_type(instance)&#xff1a;helper 模块is_extension_suppor…

作者头像 李华
网站建设 2026/6/9 15:05:20

JMeter 实战:JSON 提取器结果双引号转义处理

在 JMeter 接口测试或数据处理场景中&#xff0c;我们常通过 JSON 提取器从响应结果中提取指定内容&#xff0c;但提取后的字符串若包含双引号&#xff08;"&#xff09;&#xff0c;在后续数据传输、入库或二次处理时&#xff0c;可能因格式问题引发解析异常。本文将详细…

作者头像 李华
网站建设 2026/6/9 15:07:27

鸿鹄CAD-让CAD制图改图更流畅高效

鸿鹄CAD-让CAD制图改图更流畅高效 上一期我们介绍了工程变更的几种类型和相应的注意事项&#xff0c;今天给大家讲解设计变更的主要工作流程&#xff0c;让大家从整体上了解变更全流程。同时以一个弱电电缆桥架变更图绘制的案例&#xff0c;为大家介绍桥架的各组成部分及其作用…

作者头像 李华
网站建设 2026/6/9 15:06:32

Docker run命令启动Miniconda-Python3.10运行PyTorch示例

Docker 运行 Miniconda-Python3.10 并启动 PyTorch 实战指南 在深度学习项目日益复杂的今天&#xff0c;你是否也曾遇到过这样的场景&#xff1a;代码在本地运行完美&#xff0c;推送到服务器却因环境差异报错&#xff1f;或是团队成员之间因为 PyTorch 版本不一致导致实验结果…

作者头像 李华