Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的LDAP搜索:DN包含,_Java_Ldap_Escaping - Fatal编程技术网

java中的LDAP搜索: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()) {

我当前在搜索DN包含逗号的条目时遇到问题:

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
实际上是一个常用搜索方法的参数。