Java的JNDI学习

mcjiyuan

逐步接近Java安全,加油加油。

参考:

Java8 中文教程 - Trail:Java 命名和目录interface | Docs4dev

JNDI Overview (oracle.com)

Java反序列化之JNDI学习 | Drunkbaby’s Blog (drun1baby.top)

JNDI与RMI、LDAP-腾讯云开发者社区-腾讯云 (tencent.com)

前言

Java Naming and Directory Interface (JNDI)是一个应用程序编程接口(API),它提供命名和 目录功能到使用Java编写的应用程序 TM编程语言。它被定义为独立于任何特定的目录服务实现。因此,可以以一种通用的方式访问各种目录——新的、正在出现的和已经部署的目录。

体系结构

JNDI体系结构由API和服务提供者接口(SPI)组成。Java应用程序使用JNDI API访问各种命名和目录服务。 SPI允许透明地插入各种命名和目录服务,从而允许使用JNDI API的Java应用程序访问它们的服务。

jndiarch

Packaging

JNDI包含在 Java 2 SDK, v1.3以及后来的版本。它也可以作为 Java标准扩展用于 JDK 1.1Java 2 SDK, v1.2. 它扩展了v1.1和v1.2平台,以提供命名和目录功能。

要使用JNDI,您必须拥有JNDI类和一个或多个服务提供者。Java 2 SDK v1.3包含以下命名/目录服务的三个服务提供程序:

  • 轻量级目录访问协议(LDAP)
  • 公共对象请求代理体系结构(CORBA)公共对象服务(COS)名称服务
  • Java远程方法调用(RMI)注册中心

JNDI分为五个包:

Naming Package

javax.naming软件包包含用于访问命名服务的类和interface。

Context

Jndi 在对不同服务进行调用的时候,会去调用 xxxContext 这个类

javax\.naming包定义了一个Contextinterface,该interface是用于查找,绑定/解除绑定,重命名对象以及创建和销毁子上下文的核心interface。

  • Lookup
    • 最常用的操作是lookup()。您提供lookup\(\)您要查找的对象的名称,它返回绑定到该名称的对象。
  • Bindings
    • listBindings()返回名称到对象绑定的枚举。绑定是一个 Tuples,包含绑定对象的名称,对象的类的名称以及对象本身。
  • List
    • list()listBindings\(\)类似,除了它返回名称的枚举,其中包含对象名称和对象类的名称。 list\(\)对于想要发现有关上下文中绑定的对象的信息但不需要所有实际对象的应用程序(如浏览器)很有用。尽管listBindings\(\)提供了所有相同的信息,但它可能是更昂贵的操作。
  • Name
    • Name是代表通用名称的interface-零个或多个组件的有序序列。命名系统使用此interface来定义遵循其名称的名称,如命名和目录概念类中所述。
  • References
    • 对象以不同的方式存储在命名和目录服务中。引用可能是对象的非常紧凑的表示形式。

JNDI 定义了Reference类来表示引用。参考包含有关如何构造对象副本的信息。 JNDI 会try将从目录中查找到的引用转换为它们所代表的 Java 对象,以便 JNDIClient 端错觉目录中存储的是 Java 对象。

初始上下文

在 JNDI 中,所有命名和目录操作都是相对于上下文执行的。没有绝对的根源。因此,JNDI 定义了一个InitialContext,它提供了命名和目录操作的起点。一旦有了初始上下文,就可以使用它来查找其他上下文和对象。

Exceptions

JNDI 定义了用于在执行命名和目录操作过程中引发的异常的类层次结构。该类层次结构的根是NamingException。对处理特定异常感兴趣的程序可以catch异常的相应子类。否则,他们应该抓住NamingException

Directory Package

javax.naming.directory包扩展了javax.naming包,以提供除命名服务之外的用于访问目录服务的功能。此程序包允许应用程序检索与目录中存储的对象相关联,并使用指定的属性搜索对象。

目录上下文

DirContextinterface表示目录上下文DirContext还可以通过扩展Contextinterface充当命名上下文。这意味着任何目录对象都可以提供命名上下文。它定义了检查和更新与目录条目关联的属性的方法。

  • Attributes
    • 您使用getAttributes()方法来检索与目录条目(为其提供名称)关联的属性。使用modifyAttributes()方法修改属性。您可以使用此操作添加,替换或删除属性和/或属性值。
  • Searches
    • DirContext包含用于执行基于内容的目录搜索的方法。在最简单,最常见的用法中,应用程序指定一组可能具有特定值的属性以进行匹配,并将此属性集提交给search()方法。其他search()的重载形式支持更复杂的搜索过滤器。

LDAP Package

javax.naming.ldap软件包包含用于使用特定于LDAP v3的功能的类和interface,而通用javax.naming.directory软件包尚未涵盖这些功能。实际上,大多数使用 LDAP 的 JNDI 应用程序都可以找到javax.naming.directory软件包,并且根本不需要使用javax\.naming\.ldap软件包。该软件包主要用于那些需要使用“扩展”操作,控件或未经请求的通知的应用程序。

  • “Extended” Operation
    • LDAP v3(RFC 2251)除了指定诸如搜索和修改之类的定义明确的操作外,还指定一种在 LDAPClient 端和服务器之间传输尚未定义的操作的方式。这些操作称为“扩展”操作。 “扩展”操作可以由标准组织(例如 Internet 工程任务组(IETF))或卖方来定义。
  • Controls
    • LDAP v3允许任何尚未定义的修饰符(称为 controls )增强任何请求或响应。与请求一起发送的控件是request 控件,而与响应一起发送的控件是response 控件。控件可由 IETF 等标准组织或卖方定义。请求控件和响应控件不一定成对,也就是说,每个发送的请求控件都不需要响应控件,反之亦然。
  • Unsolicited Notifications
    • 除了 Client 端与服务器之间的正常请求/响应交互方式之外,LDAP v3还指定未经请求的通知-从服务器异步发送到 Client 端的消息,而不是响应任何 Client 端请求的消息。

LDAP 上下文

LdapContextinterface表示上下文,用于执行“扩展”操作,发送请求控件和接收响应控件。 JNDI 教程的控件和扩展类中介绍了如何使用这些功能的示例。

Event Package

javax.naming.event程序包包含用于在命名和目录服务中支持事件通知的类和interface。在Event Notification跟踪中详细描述了事件通知。

  • Events
    • NamingEvent表示由命名/目录服务生成的事件。该事件包含标识事件类型的 type 。例如,事件类型分为影响名称空间的事件类型(例如“已添加对象”)和不影响名称空间的事件类型(例如“对象已更改”)。
  • Listeners

要接收事件通知,必须向EventContextEventDirContext注册监听器。注册后,当命名/目录服务中发生相应更改时,侦听器将收到事件通知。有关事件通知的详细信息,请参见JNDI Tutorial

服务提供商套餐

javax.naming.spi包提供了不同的命名/目录服务提供者的开发人员可以用来开发和连接其实现的方法,以便可以从使用 JNDI 的应用程序访问相应的服务。

  • Plug-In Architecture
    • javax\.naming\.spi包允许动态插入不同的实现。这些实现包括initial context的实现以及可以从初始上下文到达的上下文。
  • Java 对象支持
    • javax\.naming\.spi软件包支持lookup的实现者和相关方法,以返回 Java 程序员自然而直观的 Java 对象。例如,如果您从目录中查找打印机名称,则可能希望返回要对其进行操作的打印机对象。此支持以object factories的形式提供。

该软件包还提供了相反的支持。也就是说,Context.bind()和相关方法的实现者可以接受 Java 对象,并以基础命名/目录服务可接受的格式存储对象。此支持以state factories的形式提供。

  • 多种命名系统(联合会)
    • JNDI 操作允许应用程序提供跨越多个命名系统的名称。在完成操作的过程中,一个服务提供者可能需要与另一服务提供者进行交互,例如将操作 continue 进行,以在下一个命名系统中 continue 进行。该软件包为不同的提供者提供支持以合作完成 JNDI 操作。

有关服务提供者机制的详细信息,请参见JNDI Tutorial