powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Все запросы к LDAP завершаются exception
5 сообщений из 5, страница 1 из 1
Все запросы к LDAP завершаются exception
    #38535296
olexande
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заранее спасибо!

Для учебного построения своего велосипеда, есть необходимость делать запросы к LDAP. В реальности стоит MS AD LDAP реализация от 2008 сервера. На ней и тренируюсь.

Запросы делать получилось. Ответы верны :)

Загвоздка в том, что в отличие от SQL-запросов, все запросы завершаются ошибкой (exception).
Для некоторых ошибок помогло с помощью гугла добавление таймаута. Но теперь "лезут" другие...

Может я нашел "неудачный пример"? Или это "нормально"?

Источник, код и последняя ошибка ниже:

источник примера

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
    import javax.naming.Context;
    import javax.naming.NamingEnumeration;
    import javax.naming.directory.*;
    import java.util.Hashtable;
     
    /**
     * User: gmc
     * Date: 16/02/11
     * http://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/LdapBasicExample.java?r=2
     */
    public class LdapBasicExample {
     
        public static void main(String[] args) {
            String userName = "ldaplogin";         // Логин входа в АД
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/dc=firma,dc=ua");     // Адрес сервера
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, new String("firma" + "\\" + userName));
            env.put(Context.SECURITY_CREDENTIALS, "ldappass");    // Пароль
            env.put(Context.REFERRAL, "follow");
            env.put("com.sun.jndi.ldap.read.timeout", "500");       // Настройка таймаута. Пробовал разные значения. Но мне не помогает :(
     
            DirContext ctx = null;
            NamingEnumeration results = null;
            try {
                ctx = new InitialDirContext(env);
                SearchControls controls = new SearchControls();
                controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
                controls.getCountLimit();
     
    //            String usersName = "ldapaccess";
    //            String filter = "(userid="+usersName+")";
    //            String filter = "(objectclass=person)&(userid=" + usersName + ")";
    //            String filter = "(objectclass=person)";
     
                String filter = "(mail=*)";              // Фильтр поиска
     
                String base="";
     
                results = ctx.search(base, filter, controls);
                while (results.hasMore()) {
                    SearchResult searchResult = (SearchResult) results.next();
                    Attributes attributes = searchResult.getAttributes();
                    Attribute attr = attributes.get("cn");
                    String cn = (String) attr.get();
                    System.out.println(" Person Common Name = " + attributes.get("cn"));
    //                System.out.println(" Person Display Name = " + attributes.get("displayName"));
                    System.out.println(" Person e-mail = " + attributes.get("mail"));
                    //System.out.println(" Person logonhours = " + attributes.get("logonhours"));
    //                System.out.println(" Person MemberOf = " + attributes.get("memberOf"));
                }
            } catch (Throwable e) {
                e.printStackTrace();
            } finally {
                if (results != null) {
                    try {
                        results.close();
                    } catch (Exception e) {
                    }
                }
                if (ctx != null) {
                    try {
                        ctx.close();
                    } catch (Exception e) {
                    }
                }
            }
        }
    }



javax.naming.PartialResultException [Root exception is javax.naming.CommunicationException: firma.UA:389 [Root exception is java.net.ConnectException: Connection timed out: connect]]
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:242)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:380)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:380)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(LdapNamingEnumeration.java:189)
at LdapBasicExample.main(LdapBasicExample.java:41)
Caused by: javax.naming.CommunicationException: firma.UA:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:92)
at com.sun.jndi.ldap.LdapReferralException.getReferralContext(LdapReferralException.java:150)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreReferrals(LdapNamingEnumeration.java:357)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:226)
... 6 more
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:366)
at com.sun.jndi.ldap.Connection.<init>(Connection.java:201)
at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:136)
at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1600)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2698)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:316)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:152)
at com.sun.jndi.url.ldap.ldapURLContextFactory.getObjectInstance(ldapURLContextFactory.java:52)
at javax.naming.spi.NamingManager.getURLObject(NamingManager.java:601)
at javax.naming.spi.NamingManager.processURL(NamingManager.java:381)
at javax.naming.spi.NamingManager.processURLAddrs(NamingManager.java:361)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:333)
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:111)
... 9 more
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 21 секунды)
...
Рейтинг: 0 / 0
Все запросы к LDAP завершаются exception
    #38535397
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно некоторые запросы действительно долго выполняются. 500ms это совсем мало для удаленных запросов. Поставьте несколько секунд. Возьмите любую готовую тулзу для LDAP и посмотрите в ней сколько ваши запросы выполняются.
...
Рейтинг: 0 / 0
Все запросы к LDAP завершаются exception
    #38535554
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olexandeЗаранее спасибо!
env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/dc=firma,dc=ua"); // Адрес сервера
...
env.put(Context.REFERRAL, "follow");
....
Caused by: java.net.ConnectException: Connection timed out: connect
....
at com.sun.jndi.ldap.LdapReferralContext.<init>(LdapReferralContext.java:111

есть мнение, что в условия Вашего поиска попадают рефералы, которые находятся на других узлах AD, а к этим узлам у вас доступа нет, варианта борьбы два: подключаться к глобальному каталогу (нужно установить у какого сервера есть такая роль и соответственно подключаться по порту 3268, в приницпе можно огрести проблем из-за того, что в глобальный каталог попадают не все атрибуты), использовать Context.REFERRAL, "ignore"
...
Рейтинг: 0 / 0
Все запросы к LDAP завершаются exception
    #38536152
olexande
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz500ms
Пробовал и секунду. не помогало.
Пробовал и заведомо "короткий запрос" - получаю ответ. программа ждет. получаю эксепшн.
Пробовал и на "объемном запросе" ставить разное время - ексепшн всегда появлялся. При очень коротком времени сессии, получал только часть данных. При более длинных - больше информации.

Попробовать сделать короткий запрос с разным временем и скинуть логи? Наверно, таки попробую. Может, что интересное покажет.

BlazkowiczВозьмите любую готовую тулзу для LDAP и посмотрите в ней сколько ваши запросы выполняются. Можете что-то "по проще" порекомендовать. "Что-то" нашел, но с запросами напрямую разобрался быстрее, чем с той тулзой ...

Андрей Панфиловиспользовать Context.REFERRAL, "ignore" - спасибо, попробую и отпишусь.
...
Рейтинг: 0 / 0
Все запросы к LDAP завершаются exception
    #38556372
olexande
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был слегка занят некоторое время другими задачами.

Попробовал:
Андрей Панфиловиспользовать Context.REFERRAL, "ignore" - спасибо, попробую и отпишусь.[/quot]
ИМХО стало хуже. Появились "промежуточные" исключения.

Так же получил неожиданные для себя результаты:

Работает:
Код: java
1.
String filter = "(mail=*)";              // Фильтр поиска



Выдает ексепшн:
Код: java
1.
String filter = "(mail = *)";              // Фильтр поиска


javax.naming.directory.InvalidSearchFilterException: invalid attribute description; remaining name ''
at com.sun.jndi.ldap.Filter.encodeSimpleFilter(Filter.java:437)
at com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:146)
at com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74)
at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:539)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1847)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1772)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:386)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:356)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:339)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at LdapBasicExample.main(LdapBasicExample.java:42)
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 6 секунды)


А отличаются-то они всего-навсего пробелами вокруг знака "=" в теле фильтра.

Относительно много нервов и времени потерял, пытаясь найти причину.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Все запросы к LDAP завершаются exception
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]