最开始的时候我只用DN查询代码如下:
            String searchFilter = SystemInfo.getSecurityCredentialAttName()
                    + "=" + userID;
            NamingEnumeration en =
                ctx.search(SystemInfo.getLdapSearchBase(),
                        searchFilter, constraints);结果一直正常,但是当我想增加一个条件的时候,我就按照以下做法来做
            String searchFilter = SystemInfo.getSecurityCredentialAttName()
                    + "=" + userID;
            String sf[] = new String[2];
            sf[0] = searchFilter;
            sf[1] = "entryStatus=active";
            String sf1 = "&(" + sf[0] + ") (" + sf[1] + ")";
            NamingEnumeration en =
                ctx.search(SystemInfo.getLdapSearchBase(),
                        sf1, constraints);
但是这个始终不能返回正确的结果,高手请问,这么做是否正确?
如果是多条件查询应该怎么做,谢谢

解决方案 »

  1.   

    没人回答,只好自己看JNDI的tutorial,发现我犯了一个很低级的错误Each item must be enclosed within a set of parentheses, as in "(sn=Geisel)". These items are composed using logical operators such as "&" (conjunction) to create logical expressions, as in "(& (sn=Geisel) (mail=*))". tutorial的意思是这里的每个search条件都要包含在一个括号里,例如"(sn=Geisel)",而这些条件最后要用一个逻辑的操作符号例如as "&" (conjunction)来建立逻辑表达式,正如"(& (sn=Geisel) (mail=*))". 而我的程序里,恰好少了外边的一个大括号,修改程序为
               String searchFilter = SystemInfo.getSecurityCredentialAttName()
                        + "=" + userID;
                String sf[] = new String[2];
                sf[0] = searchFilter;
                sf[1] = "entryStatus=active";
                String sf1 = "(&(" + sf[0] + ") (" + sf[1] + "))";
                NamingEnumeration en =
                    ctx.search(SystemInfo.getLdapSearchBase(),
                            sf1, constraints);连接LDAP,结果正常,谢天谢地。最终得出一个结论,当有问题发生的时候,不要慌乱,找一本资料好好地查阅,一定会找到解决方案
      

  2.   

    赞扬楼主能否共享一下你的Java访问LDAP代码。
    我可以拿php访问ldap的全代码交换。[email protected]
    C++的也有一些