news 2026/2/20 6:11:17

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/2/17 3:01:09

孩子近视增长快,有什么方法可以帮助孩子防控近视吗?

想做好防控&#xff0c;先得明白根源。很多家长觉得孩子近视就是看手机多了&#xff0c;其实没这么简单。长期近距离用眼导致的调节力下降&#xff0c;才是近视加深的重要诱因。你可以把眼睛的调节功能想象成相机的自动对焦系统&#xff0c;正常情况下能灵活切换远近对焦。但如…

作者头像 李华
网站建设 2026/1/29 17:18:19

华为OD机试 - 文件存储系统的排序 - 深度优先搜索dfs(Python/JS/C/C++ 双机位C卷 200分)

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

作者头像 李华
网站建设 2026/2/18 6:57:45

华为OD机试 - 矩阵扩散(Java 双机位C卷 100分)

华为OD机试 双机位C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的…

作者头像 李华
网站建设 2026/2/2 19:59:34

Jupyter Notebook导出PDF报告时的字体兼容性设置

Jupyter Notebook导出PDF报告时的字体兼容性设置 在数据科学和人工智能项目中&#xff0c;我们常常需要将实验过程、分析结果与可视化图表整合成一份结构清晰的技术报告。Jupyter Notebook 凭借其“代码文档”一体化的交互式特性&#xff0c;已成为科研人员和工程师首选的开发环…

作者头像 李华
网站建设 2026/2/19 4:41:59

PHP EOF (Heredoc)

PHP EOF (Heredoc) 引言 在PHP编程中,EOF(End Of File)语句提供了一种简洁的方式来定义多行字符串。这种语法特别适用于定义长字符串、配置文件、模板或任何需要包含多行文本的场景。EOF语句通过使用特殊的标记来定义字符串的开始和结束,从而使得代码更加清晰和易于阅读。…

作者头像 李华
网站建设 2026/2/17 0:43:48

JSP 连接数据库

JSP 连接数据库 引言 JavaServer Pages(JSP)是一种动态网页技术,它允许开发人员使用Java代码来创建交互式网页。在Web开发中,数据库是存储和管理数据的重要工具。JSP与数据库的连接是实现动态网页与数据库交互的关键。本文将详细介绍JSP连接数据库的方法、步骤以及注意事…

作者头像 李华