Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Поставщик услуг DNS для
Каталог Именования Java Interface™ (JNDI)

Оглавление


Введение

Поставщик услуг DNS позволяет приложениям JNDI получать доступ к информации, хранившей в Системе Имени интернет-домена. Провайдер представляет пространство имен DNS как дерево контекстов каталога JNDI, и ресурсные записи DNS как атрибуты JNDI.

Этот документ описывает функции поставщика услуг DNS, и содержит детали того, как DNS отображается на JNDI.


Соответствие

Поставщик услуг DNS поддерживает Систему доменных имен как описано в RFC 1034 и RFC 1035, и как обновлено и разъяснено RFC 1123 и RFC 2181. Это в настоящий момент поддерживает следующие типы ресурсной записи и классы:

Ввести Где Определено
A RFC 1035
NS RFC 1035
CNAME RFC 1035
SOA RFC 1035
PTR RFC 1035
MX RFC 1035
TXT RFC 1035
HINFO RFC 1035
AAAA RFC 1886
NAPTR RFC 2915
SRV RFC 2782
Каждый поиск первоначально выполняется, используя UDP. Если ответ является слишком длинным, чтобы быть возвращенным в пакете UDP, не будучи усеченным, поиск повторяется, используя TCP.

Свойства среды

Следующие свойства среды JNDI относятся к поставщику услуг DNS. См. документацию JNDI для описания того, как свойства инициализируются, используя начального конструктора контекста, системные свойства, параметры апплета, и файлы ресурсов.

java.naming.authoritative

Это свойство используется, чтобы определить, должны ли все ответы быть авторитетными. Если его значением является "true", только авторитетные ответы принимаются от серверов DNS; иначе, все ответы принимаются. Если это свойство не было установлено, значением по умолчанию является "false". Вот пример, который определяет, что все ответы должны быть авторитетными.

env.put(Context.AUTHORITATIVE, "true");

Отметьте, что некоторая информация могла бы быть сделана недоступной, когда Вы запрашиваете, чтобы только авторитетные ответы были возвращены, потому что протокол DNS не обеспечивает способ запросить достоверную информацию. Например, поставщик услуг DNS, возможно, получил неавторитетные данные как результат запроса и впоследствии вынуждается отбросить это, потому что только авторитетные данные могут быть возвращены.

java.naming.factory.initial

Это свойство используется, чтобы выбрать поставщика услуг DNS как начальный контекст. Это не используется провайдером непосредственно. Это определяет имя класса начальной фабрики контекста для провайдера, и может быть установлено как в следующем примере:

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.example.jndi.dns.DnsContextFactory");

java.naming.factory.object

Это свойство содержит разделенный от двоеточия список полностью определенных имен классов объектных фабрик для того, чтобы преобразовать объекты, считанные из DNS. Этот механизм используется, чтобы преобразовать объекты в формы, более полезные для приложения. См. DirectoryManager.getObjectInstance() для деталей.

java.naming.provider.url

Это свойство определяет имя хоста и порт сервера DNS, используемого начальным контекстом DNS, также доменное имя начального контекста. Для получения дополнительной информации на формате URL см. DNS псевдо-URL ниже. Например:

env.put(Context.PROVIDER_URL, "dns://server1.example.com/example.com");

заставит провайдера использовать сервер DNS в server1.example.com, и устанавливать доменное имя начального контекста к example.com. Если это свойство не устанавливается, оно принимает значение по умолчанию к "dns:" (все значения по умолчанию как описано в DNS псевдо-URL разделяют, используются).

Многократные серверы DNS могут быть определены, устанавливая это свойство в разделенный пробелом список URL. С каждым из серверов связываются поочередно, пока один из них не отвечает. Так как у начального контекста есть только единственное доменное имя, если многократные URL перечисляются тогда, каждый должен содержать ту же самую доменную часть. Например:

env.put(Context.PROVIDER_URL,
    "dns://server1.example.com/example.com dns://server2.example.com/example.com");

com.example.jndi.dns.lookup.attr

Прежде, чем JNDI вызывает объектную фабрику на контекст DNS, это чтениями по умолчанию и передачами в фабрику любой Интернет атрибуты TXT контекста. Это свойство, если установлено, называет альтернативный идентификатор атрибута, чтобы использовать. См. Отображающийся Контент DNS к JNDI ниже для информации о формате идентификаторов атрибута.

com.example.jndi.dns.recursion

Это свойство используется, чтобы определить, что рекурсия отвергается на запросах DNS. Если это свойство не было установлено или если оно было установлено в "true", рекурсия позволяется; иначе, рекурсия отвергается. Вот пример, который определяет, что рекурсия на запросах DNS должна быть отвергнута.

env.put("com.example.jndi.dns.recursion", "false");

com.example.jndi.dns.timeout.initial
com.example.jndi.dns.timeout.retries

Эти свойства используются, чтобы изменить связанные с тайм-аутом значения по умолчанию, которые провайдер DNS использует, представляя запросы UDP. Провайдер DNS представляет запросы UDP, используя следующий алгоритм экспоненциальной задержки. Провайдер представляет запрос серверу DNS и ожидает ответа, чтобы прибыть в пределах периода тайм-аута (1 секунда по умолчанию). Если это не получает ответа в пределах периода тайм-аута, это запрашивает следующий сервер и так далее. Если провайдер не получает ответа от какого-либо сервера, он удваивает период тайм-аута и повторяет процесс передачи запроса к каждому серверу до максимального количества повторений (4 по умолчанию).

Свойство "com.example.jndi.dns.timeout.initial", если установлено, определяет число миллисекунд, чтобы использовать в качестве начального периода тайм-аута (то есть перед любым удвоением). Если это свойство не было установлено, начальный тайм-аут по умолчанию является 1000 миллисекунд.

Свойство "com.example.jndi.dns.timeout.retries", если установлено, определяет число раз, чтобы повторить каждый сервер, используя алгоритм экспоненциальной задержки, описанный ранее. Если это свойство не было установлено, число по умолчанию повторений 4.

Вот пример, который удваивает начальный период тайм-аута, сохраняя полную продолжительность всех тайм-аутов, примерно неизменных.

env.put("com.example.jndi.dns.timeout.initial", "2000");
env.put("com.example.jndi.dns.timeout.retries", "3");

ОТМЕТЬТЕ: На системах ранее чем Java игнорируются 2 SDK, v 1.4.1, эти два свойства, и значения по умолчанию всегда применяются.


Отображение Контента DNS к JNDI

Поставщик услуг DNS отображает имена DNS, узлы, и ресурсные записи на типы данных JNDI следующим образом.

Имена

Доменные имена DNS представляются объектами Name составного объекта JNDI со справа налево, разделенный от точки синтаксис, и с наклонной чертой влево (\) как символ ESC. Escape-последовательности формы, \DDD может также использоваться, где DDD является трехразрядным десятичным значением. Имена являются нечувствительными к регистру. Полностью определенное имя, заканчивающееся явной корневой доменной меткой ("."), представляется составным объектом Name с пустым компонентом в старшей значащей позиции.

Имена хоста являются подмножеством доменных имен. Их метки содержат только буквы US-ASCII, цифры, и дефисы, и ни один не может начаться или закончиться дефисом. В то время как имена, не соответствующие этим правилам, могут быть допустимыми доменными именами, они не будут применимы многими приложениями DNS, и должны в большинстве случаев избежаться.

DNS не определяет кодирование (такое как UTF-8), чтобы использовать для символов кроме таковых из US-ASCII. Как следствие ни у какого символа на имя DNS никогда не будет ненулевого байта старшего разряда. Когда работа над интернационализацией доменных имен завершается, поставщик услуг DNS может быть обновлен, чтобы соответствовать той работе.

Узлы и Ресурсные записи

Узел DNS представляется объектом DirContext. Ресурсные записи узла представляются атрибутами контекста. Например, если узел DNS example.com будет содержать запись с адресом 192.0.2.33 и запись MX с данными "10 example.com", то соответствующий контекст JNDI будет иметь атрибут с идентификатором "A" и представит в виде строки значение "192.0.2.33" и атрибут с идентификатором "MX" и представит значение в виде строки "10 example.com".

Многократные записи того же самого типа представляются как многозначные атрибуты. Записи неподдерживаемых типов представляются атрибутами с числовыми идентификаторами и с байтовыми массивами как значения.

Идентификаторы атрибута

Имена классов ресурсной записи DNS и имена типов отображаются на идентификаторы атрибута JNDI. Если запись находится в интернет-классе, соответствующий ID атрибута является просто именем типа записи. Если тип является неподдерживаемым, его целочисленное значение используется вместо этого. Если запись не находится в интернет-классе, имя класса (или целочисленное значение класса) предварительно ожидается к ID атрибута, разделенному пространством. Например, идентификатор атрибута "AAAA" представляет запись адреса IPv6, и идентификатор атрибута "HS 97" представляет ресурсную запись типа 97 в классе Гесиода.

Идентификаторы атрибута суперкласса также определяются. Они могут быть полезными, запрашивая записи, используя метод DirContext.getAttributes(). Если у названия атрибута есть "*" вместо имени типа (или имя класса), это представляет записи любого типа (или класс). Например, идентификатор атрибута " IN *" можно передать к методу getAttributes(), чтобы найти все интернет-записи класса. Идентификатор атрибута " * *" представляет записи любого класса или типа.

Идентификаторы атрибута являются нечувствительными к регистру.


DNS псевдо-URL

ПОДОБНАЯ URL нотация используется, чтобы представить сервер DNS, порт, и домен в свойстве java.naming.provider.url и на имена URL, которые передают к начальному контексту. Формат этого псевдо-URL:
   dns:[//host[:port]][/domain]
Узел и порт указывают на сервер DNS, чтобы использовать. Если только узел дается, значения по умолчанию порта к 53; если только порт дается, значения по умолчанию узла к "localhost". Если ни одному не дадут, то провайдер попытается определить и использовать сервер (ы), сконфигурированный для базовой платформы, и в случае успеха, установит свойство java.naming.provider.url в разделенный пробелом список URL, созданных, используя сервер (ы). (Например, на Солярисе или Linux, провайдер считает файл /etc/resolv.conf.), Если DNS не был сконфигурирован на базовой платформе, узле и значении по умолчанию порта к "localhost" и 53.

ОТМЕТЬТЕ: На системах ранее чем Java 2 SDK, v 1.4.1, провайдер не пытается использовать конфигурацию DNS базовой платформы. Если ни узел, ни порт не определяются, они принимают значение по умолчанию к "localhost" и 53, соответственно.

Домен является доменным именем DNS контекста, и не обязательно связывается с доменом сервера. Это принимает значение по умолчанию к"." (корневой домен).


Отображение API

Поставщик услуг DNS реализует интерфейс DirContext. Методы отображаются на операции DNS как описано ниже. Методы, не перечисленные, не поддерживаются.
addToEnvironment()

Добавляет новое свойство к среде, или изменяет существующее свойство.

close()

Выпускает внутренние структуры данных.

composeName()

Составляет два имени.

getAttributes()

Атрибуты возвратов, представляющие ресурсные записи DNS.

getEnvironment()

Возвращает свойства среды, связанные с этим контекстом.

getNameInNamespace()

Возвращает полностью определенное доменное имя этого узла.

getNameParser()

Возвращает синтаксический анализатор имени для доменных имен DNS.

lookup()
lookupLink()

Возвращает DirContext, который представляет именованный узел. Метод DirectoryManager.getObjectInstance() вызывается на объект прежде, чем это будет возвращено, в случае, если приложение или пользователь предоставили объектные фабрики.

list()
listBindings()

Перечисление пространства имен DNS реализуется, используя зональные передачи, таким образом, эти операции, потенциально вычисляют - и интенсивный сетью, и они не могут поддерживаться всеми установками DNS. Метод DirectoryManager.getObjectInstance() вызывается на объект прежде, чем он будет возвращен, в случае, если приложение или пользователь предоставили объектные фабрики; ни в каких атрибутах не передают.

removeFromEnvironment()

Удаляет свойство из среды.


Примеры использования

Пример 1

В этом примере мы создаем начальный контекст, представляющий example.com домен, затем читаем IP-адреса (записи) двух узлов в том домене.
Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.example.jndi.dns.DnsContextFactory");
env.put("java.naming.provider.url",    "dns://server1.example.com/example.com");

DirContext ictx = new InitialDirContext(env);
Attributes attrs1 = ictx.getAttributes("host1", new String[] {"A"});
Attributes attrs2 = ictx.getAttributes("host2", new String[] {"A"});

Пример 2

Вместо того, чтобы использовать свойства как выше, мы можем передать DNS псевдо-URL к методам начального контекста по умолчанию. В этом примере мы читаем запись MX узла в example.com домен.

DirContext ictx = new InitialDirContext();
Attributes attrs3 = ictx.getAttributes("dns://server1.example.com/host3.example.com",
                                       new String[] {"MX"});


Соображения безопасности

Когда менеджер безопасности был установлен, поставщик услуг DNS и приложение, используя, этому нужно оба предоставить следующие полномочия:

permission java.net.SocketPermission "host[:port]", "connect,accept";

для каждого узла/порта, идентифицированного в свойстве java.naming.provider.url, на названия строк URL, предоставленные методам контекста, и в ссылках на объект.


Федерация

Поставщик услуг DNS обрабатывает составные имена как строго разделено. Таким образом, это обрабатывает первый компонент составного имени как доменное имя DNS и остальная часть компонентов как имена в следующей системе (ах) именования (nns). Неявная следующая система именования определяется динамически.

Например, вот пример, который перечисляет корень следующей системы именования, объединенной в федерацию вне контекста DNS, и того, который ищет имя, используя многокомпонентное составное имя:

// List the root of the nns.
// Note the use of a trailing slash to indicate traversal into the nns.
NamingEnumeration enum = ctx.list("java.example.com/");

// A composite name lookup.
Object obj = ctx.lookup("example.com/some/x/y/z");

Класс Где Определено
В RFC 1035
HS RFC 1035

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами