使用JNDI操作LDAP(4)(转载)
2019獨角獸企業重金招聘Python工程師標準>>>
檢索過濾器
和基本檢索不同的是,可以使用一個檢索過濾器進行檢索操作。檢索過濾器的檢索語句是通過邏輯表達式的形式表示的。檢索過濾器的語法在RFC 2254中進行了定義,DirContext.search()方法接受符合這個語法的過濾器。
下面的檢索過濾器指定了合法的實體必須具有sn屬性,并且其值為Geisel以及一個值為任意的mail屬性:(&(sn=Geisel)(mail=*))
下面的代碼創建了一個過濾器和一個默認的檢索控制,SearchControls,并使用它們來進行檢索操作。這個檢索和基本檢索中的功能是一樣的。
// Create default search controls
SearchControls ctls = new SearchControls();
// Specify the search filter to match
// Ask for objects with attribute sn == Geisel and which have
// the "mail" attribute.
String filter = "(&(sn=Geisel)(mail=*))";
// Search for objects using filter
NamingEnumeration answer = ctx.search("ou=People", filter, ctls);
// Print the answer
while (answer.hasMore()) {
???????? SearchResult sr = (SearchResult) answer.next();
???????? System.out.println(">>>" + sr.getName());
???????? GetattrsAll.printAttrs(sr.getAttributes());
}
檢索返回的結果和基本檢索的結果是一樣的。
檢索過濾器語法一覽
檢索過濾器語法基本上就是邏輯運算符作為前綴的邏輯表達式,下圖是一些邏輯運算符號及其說明:
?
?
?
過濾器中的每一項都由屬性標識符和屬性值或者上述的運算符號組成。例如,”sn=Geisel”表示必須具有sn屬性,并且sn屬性的值必須為Geisel,”mail=*”則表示mail屬性只要存在就可以了。
每一項都必須使用括號括起來使用。邏輯運算符可以組合使用,通過使用括號進行分割。例如
(| (& (sn=Geisel) (mail=*)) (sn=L*))
關于更完整的語法描述,參見RFC 2254。
返回指定屬性
可以通過設置SearchControls的setReturningAttributes()方法來設置需要返回的特定屬性:
// Specify the ids of the attributes to return
String[] attrIDs = { "sn", "telephonenumber", "golfhandicap","mail" };
ctls.setReturningAttributes(attrIDs);
其返回的結果和基本認證返回的一致。
?
檢索控制
在上面的檢索過濾器中如何使用SearchControls參數來選擇需要返回的屬性。還可以是SearchControls參數來控制檢索的其他方面,下面是一些可用的控制:
¨???????? 返回的屬性
¨???????? 檢索的范圍
¨???????? 返回的最大結果數
¨???????? 等待最大時間(毫秒),即超時時間
¨???????? 是否返回和實體相關聯的Java對象
¨???????? 在檢索時是否廢除JNDI鏈接
其中后兩部分在之后的教程中介紹,本部分教程介紹前四種控制:
檢索范圍
通過使用SearchControls.setSearchScope(int scope)方法來設置檢索范圍,檢索范圍由三種,分別如下:
static int OBJECT_SCOPE
??????????????????????????? 檢索指定的對象
static int ONELEVEL_SCOPE
??????????????????????????? 檢索指定對象及其直接子實體
static int SUBTREE_SCOPE
??????????????????????????? 在以指定對象為根的子樹中進行檢索
下圖摘自ApacheDS網站對于檢索范圍的說明,比較易懂:
?
?
?
數量限制
有的時候,需要限制查詢返回結果的數量,這個時候需要使用檢索控制的數量限制。默認情況下,檢索操作返回所有符合條件的檢索結果,可以使用SearchControls.setCountLimit()方法設置檢索結果的數量。下面的代碼將檢索結果數量設置為1:
// Set search controls to limit count to 'expected'
SearchControls ctls = new SearchControls();
ctls.setCountLimit(expected);
如果程序要獲取大于最大數量的結果,那么將拋出一個SizeLimitExceededException。所以當設置數量限制的時候,應該將這個異常和NamingExceptions異常相區分,或者根據數量限制請求結果(不要超過最大數量)。
指定檢索結果的數量是一種控制程序消耗資源的方法,比如內存或者網絡帶寬。其他控制資源消耗的辦法有實用查詢過濾器、在適當的上下文中查詢以及使用適當的檢索范圍。
設置超時
?????設置超時是為了不至于等待太長的時間,如果超過時間限制,操作還沒有執行完的話,將拋出TimeLimitExceededException,下面的代碼設置了時間限制:
ctls.setTimeLimit(1000); //set time limit to 1 second
為了使這個程序運行,需要做一些特殊的設置,例如使用較慢的服務器或者檢索范圍使用SUB_TREE檢索,并且服務器最好包含大量的實體。
當設置時間限制為0的時候,則表示沒有時間限制。?
?
轉載于:https://my.oschina.net/liferay/blog/5802
總結
以上是生活随笔為你收集整理的使用JNDI操作LDAP(4)(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打造名族品牌!杨元庆:联想核心生产制造还
- 下一篇: 联想新款小新笔记本预装忆联 1TB SS