java中的LDAP搜索:DN包含,
我当前在搜索DN包含逗号的条目时遇到问题:java中的LDAP搜索:DN包含,,java,ldap,escaping,Java,Ldap,Escaping,我当前在搜索DN包含逗号的条目时遇到问题: StringTokenizer st = new StringTokenizer(dn, "="); Attributes searchAttributes = new BasicAttributes(st.nextToken(), st.nextToken()); Enumeration results = ctx.search(baseDn, searchAttributes); if (results.hasMoreElements()) {
StringTokenizer st = new StringTokenizer(dn, "=");
Attributes searchAttributes = new BasicAttributes(st.nextToken(), st.nextToken());
Enumeration results = ctx.search(baseDn, searchAttributes);
if (results.hasMoreElements()) {
// ...
}
我测试了
dn=first、second
以及dn=first\、second
和虽然搜索运行正常,但我从未得到任何结果。相同的baseDn和dn在Eclipse/Apache Directory Studio LDAP浏览器中正常工作。取决于库的类型,例如使用Novell LDAP.jar is Constructor
searchResults = lc.search(searchBase, searchScope, searchFilter, null, false);
//private String searchFilter = "(objectClass=*)";
同样取决于目录或库,因为目录Studio LDAP浏览器可能有自己的驱动程序,并且一些方法是实现的,而另一个可能没有,例如,使用LDAP.jar可以在ActiveDirectory中搜索
基本上,所有的库(包括WindowsActiveDirectory的Java驱动程序)都包含大量与库一起打包的示例,其中最重要的是在驱动程序中实现的方法
编辑:
嗯,但是有两个相关的
1/管理员提供的上下文访问权限(环境之间)
2/对于ActiveDirectory(始终)和LDAP(旧PC)测试环境,我必须强制线程进行一些小暂停
private void readData() {
searchResults = new LDAPSearchResults();
try {
Thread.sleep(450);
} catch (InterruptedException ex) {
Logger.getLogger(Profylaxia.class.getName()).log(Level.SEVERE, null, ex);
}
try {
searchResults = lc.search(searchBase, searchScope, searchFilter, null, false);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(Profylaxia.class.getName()).log(Level.SEVERE, null, ex);
}
int noResult = searchResults.getCount();
System.out.println(" noResult : " + noResult);
//然后,在我能够开始迭代之后……ldap查询的报价规则可以在 我正在使用以下代码片段来查询cn,对于dn也应该是一样的:
String searchFilter = "(&(objectClass=user)(cn=" + query + "))";
SearchControls searchControls = new SearchControls();
String[] resultAttributes = {"cn", "distinguishedName", "displayName", "lastLogon", "description"};
searchControls.setReturningAttributes(resultAttributes);
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration ne = getContext().search(root, searchFilter, searchControls);
List<DirectoryUser> result = new ArrayList<DirectoryUser>();
while (ne.hasMoreElements()) {
SearchResult searchResult = (SearchResult)ne.nextElement();
Attributes attrs = searchResult.getAttributes();
...
}
stringsearchfilter=“(&(objectClass=user)(cn=“+query+”)”);
SearchControls SearchControls=新的SearchControls();
字符串[]resultAttributes={“cn”、“DifferentiedName”、“displayName”、“lastLogon”、“description”};
searchControls.SetReturningAttribute(结果属性);
searchControls.setSearchScope(searchControls.SUBTREE_范围);
NamingEnumeration ne=getContext().search(根目录、searchFilter、searchControls);
列表结果=新建ArrayList();
而(ne.hasMoreElements()){
SearchResult SearchResult=(SearchResult)ne.nextElement();
Attributes attrs=searchResult.getAttributes();
...
}
@MrG不客气,对于这些信息,我在几个论坛上等待了超过2周:-)您应该在这里使用查询参数。(cn={0}),并在search()方法中添加新对象[]{query}作为参数列表。@EJP:谢谢,在搜索精确匹配时,这可能会更好,大多数时候我搜索字段中包含的子字符串时,使用参数时会转义'*'。上面的searchFilter
实际上是一个常用搜索方法的参数。