故障排除技巧

这是当您try运行使用 JNDI 类的成功编译的程序时可能遇到的最常见问题。



1.您收到一个 NoInitialContextException.

原因:您没有指定用于初始上下文的实现。具体来说,Context.INITIAL_CONTEXT_FACTORY环境属性未设置为将创建初始上下文的工厂的类名称。或者,您没有使程序使用Context\.INITIAL_CONTEXT_FACTORY命名的服务提供者的类。

解决方案:将Context\.INITIAL_CONTEXT_FACTORY环境属性设置为您正在使用的初始上下文实现的类名。有关详情,请参见Configuration部分。

如果设置了属性,请确保没有键入错误的类名称,并且所命名的类可用于您的程序(在其 Classpath 中或安装在 JRE 的jre/lib/ext目录中)。 Java Platform包括 LDAP,COS 命名,DNS 和 RMI 注册表的服务提供商。必须安装所有其他服务提供商并将其添加到执行环境中。

2.您收到 CommunicationException,指示“连接被拒绝”。

原因:服务器未服务由Context\.PROVIDER_URL环境属性标识的服务器和端口。也许有人禁用或关闭了运行服务器的计算机。或者,也许您输错了服务器的名称或端口号。

解决方案:检查该端口上确实有服务器运行,并在必要时重新启动服务器。执行此检查的方式取决于您所使用的 LDAP 服务器。通常,您可以使用 管理 控制台或工具来 管理 服务器。您可以使用该工具来验证服务器的状态。

3. LDAP 服务器响应其他 Util(例如其 管理 控制台),但似乎不响应程序的请求。

原因:服务器不响应 LDAP v3 连接请求。某些服务器(尤其是公用服务器)无法正确响应 LDAP v3,因此会忽略请求而不是拒绝请求。另外,某些 LDAP v3 服务器在处理 Oracle LDAP 服务提供商自动发送的控件时遇到问题,并且经常返回服务器特定的故障代码。

解决方案。try将环境属性"java\.naming\.ldap\.version"设置为"2"。缺省情况下,LDAP 服务提供者try使用 LDAP v3 连接到 LDAP 服务器。如果失败,则使用 LDAP v2.如果服务器静默忽略 v3 请求,则提供程序将假定该请求有效。要变通解决此类服务器,必须显式设置协议版本以确保服务器的正确行为。

如果服务器是 v3 服务器,请在创建初始上下文之前try设置以下环境属性:

env.put(Context.REFERRAL, "throw");

这将关闭 LDAP 提供程序自动发送的控件。 (查看JNDI Tutorial了解详细信息。)

4.程序挂起。

原因:如果您try执行会产生太多结果或需要服务器检查太多条目以进行搜索的搜索,则某些服务器(尤其是公用服务器)将不会响应(甚至不会给出否定答案)产生答案。这样的服务器试图限制每个请求所消耗的资源量。

或者,您try对不支持它的服务器/端口使用安全套接字层(SSL),反之亦然(也就是说,您try使用普通套接字与 SSL 端口通信)。

最后,由于负载过重,服务器要么响应非常慢,要么由于某种原因根本没有响应。

解决方案:如果您的程序由于服务器试图限制其资源的使用而挂起,请使用将返回单个结果或仅返回几个结果的查询重试您的请求。这将帮助您确定服务器是否处于活动状态。如果是这样,则可以扩大您的初始查询并重新提交。

如果您的程序由于 SSL 问题而挂起,则需要找出该端口是否为 SSL 端口,然后适当设置Context.SECURITY_PROTOCOL环境属性。如果端口是 SSL 端口,则此属性应设置为"ssl"。如果它不是 SSL 端口,则不应设置此属性。

如果您的程序由于以上原因均未挂起,则属性com\.sun\.jndi\.ldap\.read\.timeout可以方便地指定读取超时。此属性的值是整数的字符串 表示形式,该整数表示 LDAP 操作的读取超时(以毫秒为单位)。如果 LDAP 提供程序在这段时间内无法获得 LDAP 响应,它将中止读取try。整数应大于零。小于或等于零的整数表示未指定读取超时,这等效于无限期 await 响应,直到接收到它为止。

如果未指定此属性,则默认值为 await 响应,直到收到响应为止。

For example,

如果服务器在 5 秒钟内没有响应,则env.put("com.sun.jndi.ldap.read.timeout", "5000");使 LDAP 服务提供者中止读取try。

5.您会收到 NameNotFoundException.

原因:初始化 LDAP 的初始上下文时,将提供一个根专有名称。例如,如果将初始上下文的Context\.PROVIDER_URL环境属性设置为"ldap://ldapserver:389/o=JNDITutorial",然后提供了诸如"cn=Joe,c=us"之类的名称,则传递给 LDAP 服务的全名是"cn=Joe,c=us,o=JNDITutorial"。如果这确实是您想要的名称,则应检查服务器以确保它包含这样的条目。

另外,如果您提供不正确的专有名称用于身份验证,则 Oracle Directory Server 会返回此错误。例如,如果将Context.SECURITY_PRINCIPAL环境属性设置为"cn=Admin, o=Tutorial",并且"cn=Admin, o=Tutorial"不是 LDAP 服务器上的条目,则 LDAP 提供程序将抛出NameNotFoundException。 Oracle Directory Server 返回的正确错误实际上应该是与身份验证相关的内容,而不是“找不到名称”。

解决方案:确认您提供的名称是服务器上现有条 Object 名称。您可以通过列出条 Object 父上下文或使用其他工具(例如目录服务器的 管理 控制台)来执行此操作。


当try部署使用 JNDI 类的 applet 时,可能会遇到一些问题。

6.当您的 applet try与在与加载 applet 的计算机不同的计算机上运行的目录服务器进行通信时,您将获得 AppletSecurityException

原因:您的 Servlets 未签名,因此它只能连接到加载它的机器。或者,如果该 Servlets 已签名,则浏览器未授予该 Servlets 连接到目录服务器计算机的权限。

解决方案:如果要允许该 applet 连接到在任意计算机上运行的目录服务器,则需要 applet 对* applet 将使用的所有 JNDI JAR 进行签名。有关签名 jars 的信息,请参见签名和验证 JAR 文件

7.当您的 Servlets try使用系统属性来设置环境属性时,您将收到一个 AppletSecurityException。

原因:Web 浏览器限制对系统属性的访问,如果try读取它们,则抛出SecurityException

解决方案:如果您需要获取 applet 的 Importing,请try使用 applet 参数。

8.当 Firefox 内部运行的小应用程序try使用 CRAM-MD5 向 LDAP 服务器进行身份验证时,您将获得 AppletSecurityException。

原因:Firefox 禁用对java\.security软件包的访问。 LDAP 提供程序使用java\.security\.MessageDigest提供的消息摘要功能来实现 CRAM-MD5.

解决方案:使用 Java 插件。