文档

Java™ 教程
隐藏目录
故障排除技巧
路径: Java命名和目录接口
课程: 命名和目录操作

故障排除技巧

以下是在尝试运行使用JNDI类的成功编译的程序时可能遇到的最常见问题。


  1. 没有初始上下文
  2. 连接被拒绝
  3. 连接失败
  4. 程序卡住
  5. 名称未找到
  6. 无法连接到任意主机
  7. 无法访问系统属性进行配置
  8. 无法使用CRAM-MD5进行身份验证

1. 您遇到了 NoInitialContextException

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

解决方法:将 Context.INITIAL_CONTEXT_FACTORY 环境属性设置为您正在使用的初始上下文实现的类名。有关详细信息,请参阅 配置 部分。

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

2. 您遇到了 CommunicationException,表示 "连接被拒绝"。

原因:由 Context.PROVIDER_URL 环境属性标识的服务器和端口没有被服务器提供服务。可能有人禁用或关闭了运行服务器的计算机。或者,您可能输入了错误的服务器名称或端口号。

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

3. LDAP 服务器对其他实用工具(如其管理控制台)作出响应,但似乎不对程序的请求作出响应。

原因:服务器不对 LDAP v3 连接请求作出响应。一些服务器(特别是公共服务器)无法正确响应 LDAP v3 请求,而是忽略请求而不是拒绝它们。此外,一些 LDAP v3 服务器在处理 Oracle 的 LDAP 服务提供程序自动发送的控件时存在问题,并经常返回特定于服务器的失败代码。

解决方法。尝试将环境属性"java.naming.ldap.version"设置为"2"。LDAP服务提供程序默认尝试使用LDAP v3连接到LDAP服务器;如果失败,则使用LDAP v2。如果服务器静默忽略v3请求,则提供程序将假定该请求成功。为了解决这样的服务器问题,您必须显式设置协议版本以确保服务器的正确行为。

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

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

这将关闭LDAP提供程序自动发送的控件。(请查看JNDI教程获取详细信息。)

4. 程序挂起。

原因:某些服务器(尤其是公共服务器)如果尝试执行会生成太多结果或需要服务器检查太多条目才能生成答案的搜索操作,将不会响应(甚至没有负面答案)。这样的服务器试图限制它们在每个请求上消耗的资源量。

或者,您尝试对不支持它的服务器/端口使用安全套接字层(SSL),反之亦然(即,您尝试使用普通套接字与SSL端口进行通信)。

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

解决方法:如果您的程序因服务器试图限制其资源使用而挂起,那么请使用返回单个结果或仅返回少量结果的查询重试您的请求。这将帮助您确定服务器是否正常运行。如果是,则可以扩大初始查询并重新提交。

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

如果您的程序出于以上原因之外的原因而挂起,则可以使用属性com.sun.jndi.ldap.read.timeout来指定读取超时时间。该属性的值是以毫秒为单位的读取超时的整数字符串表示。如果LDAP提供程序在该时间段内无法获取LDAP响应,则会中止读取尝试。整数应大于零。小于或等于零的整数表示未指定读取超时,相当于一直等待直到接收到响应。

如果未指定此属性,则默认是在收到响应之前等待。

例如,

env.put("com.sun.jndi.ldap.read.timeout", "5000");会导致LDAP服务提供程序在服务器在5秒内未回复时中止读取尝试。

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 返回的正确错误实际上应与身份验证相关,而不是“未找到名称”。

解决方法:验证您提供的名称是否是服务器上存在的条目。您可以通过列出条目的父上下文或使用其他工具(如目录服务器的管理控制台)来完成。


以下是在尝试部署使用JNDI类的小程序时可能遇到的一些问题。

6. 当您的小程序尝试与与其加载小程序的机器不同的机器上运行的目录服务器进行通信时,您会收到一个 AppletSecurityException 错误。

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

解决方法:如果您想允许小程序连接到任意机器上运行的目录服务器,则需要对您的小程序 您的小程序将使用的所有JNDI JAR文件进行签名。有关签名JAR文件的信息,请参阅签名和验证JAR文件

7. 当你的小程序试图使用系统属性来设置环境属性时,你会得到一个AppletSecurityException异常。

原因:网络浏览器限制对系统属性的访问,并在你试图读取它们时抛出SecurityException异常。

解决方案:如果你需要为你的小程序获取输入,尝试使用小程序参数。

8. 当运行在Firefox浏览器中的小程序试图使用CRAM-MD5进行LDAP服务器身份验证时,你会得到一个AppletSecurityException异常。

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

解决方案:使用Java插件。



上一页: 时间限制
下一页: LDAP用户的高级主题