javax.naming.ldap

javax.naming.ldap是使用 Java 程式語言編寫的程式。

基本介紹

  • 外文名:javax.naming.ldap
  • 提供:對 LDAPv3 擴展操作和控制項的支持
  • 對象:使用 Java 程式語言編寫的程式
  • 注意:與任何特定的命名實現無關
簡介,擴展操作,方法1,方法2,

簡介

軟體包 javax.naming.ldap 的描述
提供對 LDAPv3 擴展操作和控制項的支持。
此包擴展 Java Naming and Directory InterfaceTM (JNDI) 的目錄操作。 JNDI 向使用 Java 程式語言編寫的應用程式提供命名和目錄功能。它被設計成與任何特定的命名或目錄服務實現無關。因此可以使用共同的方式對多種服務(新的、新出現的及已經部署的服務)進行訪問。
此包用於處理 LDAPv3 擴展操作和控制項的應用程式和服務提供程式,這在 RFC 2251 中定義。此包中的核心接口是 LdapContext,該接口定義了一些在上下文中執行擴展操作和處理控制項的方法。

擴展操作

此包定義了接口 ExtendedRequest 來表示擴展操作的參數,定義了接口 ExtendedResponse 來表示擴展操作的結果。擴展回響始終與擴展請求成對出現,但反過來不一定成立。即擴展請求可以沒有對應的擴展回響。

方法1

應用程式通常不直接處理這些接口,而是處理實現 這些接口的類。應用程式可能作為通過 IETF 進行標準化的擴展操作清單的一部分獲取這些類,也可能從特定於供應商的擴展操作的目錄供應商獲取這些類。請求類應該具有以類型安全的、用戶友好的方式接受參數的構造方法,而回響類應該具有以類型安全的、用戶友好的方式獲取回響數據的訪問方法。請求/回響類在內部處理編碼和解碼的 BER 值。
例如,假定 LDAP 伺服器支持“獲取時間”擴展操作。它將提供諸如 GetTimeRequest 和 GetTimeResponse 之類的類,以便應用程式可以使用此功能。應用程式將按以下方式使用這些類:
GetTimeResponse resp =
(GetTimeResponse) ectx.extendedOperation(new GetTimeRequest());
long time = resp.getTime();
GetTimeRequest 和 GetTimeResponse 類可能按照以下方式定義:
public class GetTimeRequest implements ExtendedRequest {
// User-friendly constructor
public GetTimeRequest() {
};
// Methods used by service providers
public String getID() {
return GETTIME_REQ_OID;
}
public byte[] getEncodedValue() {
return null; // no value needed for get time request
}
public ExtendedResponse createExtendedResponse(
String id, byte[] berValue, int offset, int length) throws NamingException {
return new GetTimeResponse(id, berValue, offset, length);
}
}
public class GetTimeResponse() implements ExtendedResponse {
long time;
// called by GetTimeRequest.createExtendedResponse()
public GetTimeResponse(String id, byte[] berValue, int offset, int length)
throws NamingException {
// check validity of id
long time = ... // decode berValue to get time
}
// Type-safe and User-friendly methods
public java.util.Date getDate() { return new java.util.Date(time); }
public long getTime() { return time; }
// Low level methods
public byte[] getEncodedValue() {
return // berValue saved;
}
public String getID() {
return GETTIME_RESP_OID;
}
}

方法2

控制項
此包定義了接口 Control 來表示 LDAPv3 控制項。它可以是傳送到 LDAP 伺服器的控制項(請求控制項)或由 LDAP 伺服器返回的控制項(回響控制項)。與擴展請求和回響不同,在請求控制項和回響控制項之間不存在任何必然的配對關係。可以傳送請求控制項而不要求返迴響應控制項,也可以收到回響控制項而沒有傳送任何請求控制項。
應用程式通常不直接處理此接口,而是處理實現 此接口的類。應用程式可能作為通過 IETF 進行標準化的控制項清單的一部分獲取控制項類,也可能從特定於供應商的控制項的目錄供應商獲取這些類。請求控制項類應該具有以類型安全的、用戶友好的方式接受參數的構造方法,而回響控制項類應該具有以類型安全的、用戶友好的方式獲取回響數據的訪問方法。請求/回響控制項類在內部處理編碼和解碼的 BER 值。
例如,假定 LDAP 伺服器支持“簽名結果”請求控制項,將此控制項與請求一起傳送時,它將請求伺服器對操作的結果進行數字簽名。它將提供 SignedResultsControl 類,以便應用程式可以使用此功能。應用程式將按以下方式使用此類:
Control[] reqCtls = new Control[] {new SignedResultsControl(Control.CRITICAL)};
ectx.setRequestControls(reqCtls);
NamingEnumeration enum = ectx.search(...);
SignedResultsControl 類可能按照以下方式定義:
public class SignedResultsControl implements Control {
// User-friendly constructor
public SignedResultsControl(boolean criticality) {
// assemble the components of the request control
};
// Methods used by service providers
public String getID() {
return // control's object identifier
}
public byte[] getEncodedValue() {
return // ASN.1 BER encoded control value
}
...
}
當服務提供程式接收回響控制項時,它將使用 ControlFactory 類生成實現 Control 接口的特定類。
LDAP 伺服器可以利用 LDAP 操作及枚舉結果(如列舉或搜尋操作返回的那些結果)發迴響應控制項。LdapContext 提供方法 (getResponseControls()) 來獲取利用 LDAP 操作傳送的回響控制項,而 HasControls 接口用於檢索與枚舉結果關聯的回響控制項。
例如,假定 LDAP 伺服器發回“更改 ID”控制項來回響成功修改。它將提供 ChangeIDControl 類,以便應用程式可以使用此功能。應用程式將執行更新,然後試圖獲取更改 ID。
// Perform update
Context ctx = ectx.createSubsubcontext("cn=newobj");
// Get response controls
Control[] respCtls = ectx.getResponseControls();
if (respCtls != null) {
// Find the one we want
for (int i = 0; i < respCtls; i++) {
if(respCtlsinstanceof ChangeIDControl) {
ChangeIDControl cctl = (ChangeIDControl)respCtls;
System.out.println(cctl.getChangeID());
}
}
}
供應商可能提供以下 ChangeIDControl 和 VendorXControlFactory 類。當服務提供程式從 LDAP 伺服器接收回響控制項時,該提供程式將使用 VendorXControlFactory。
public class ChangeIDControl implements Control {
long id;
// Constructor used by ControlFactory
public ChangeIDControl(String OID, byte[] berVal) throws NamingException {
// check validity of OID
id = // extract change ID from berVal
};
// Type-safe and User-friendly method
public long getChangeID() {
return id;
}
// Low-level methods
public String getID() {
return CHANGEID_OID;
}
public byte[] getEncodedValue() {
return // original berVal
}
...
}
public class VendorXControlFactory extends ControlFactory {
public VendorXControlFactory () {
}
public Control getControlInstance(Control orig) throws NamingException {
if (isOneOfMyControls(orig.getID())) {
...
// determine which of ours it is and call its constructor
return (new ChangeIDControl(orig.getID(), orig.getEncodedValue()));
}
return null; // not one of ours
}
}
包規範
以下文檔可以在 Java 技術站點找到:
JNDI API Document (Postscript)
JNDI API Document (PDF)
從以下版本開始:
1.3

相關詞條

熱門詞條

聯絡我們