JNDI-DNSlookup-Spring-Cookie

Хотим познакомиться с JNDI и Cookie. Со Spring уже знакомы.

Напишем jsp-файл c формой ввода доменного имени (psu.ru, vk.com и т.п.), для которого будем получать ip-адрес, синоним и почтовый сервер (если они есть) и выводить пользователю. Также будем запоминать последний отрезолвенный сервер через куку.

Приступим

Создаем стандартный проект Spring.

Создаем класс, производящий получение ip-адреса (A-запись), синонима (CN-запись) и почтового сервера (MX-запись). Получать будем через встроенный в JDK реализацию JNDI для сервера DNS: package jperm;

import java.util.*; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext;

public class DNSResolver { //private static Attributes attrs; //private static DirContext ictx; public static String resolve(String name) throws Exception  { String out = ""; Hashtable env = new Hashtable; env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); env.put("java.naming.provider.url",   "dns://212.192.64.2/"); // Можно указать "dns://212.192.64.2/psu.ru" и, тогда, разрешать для домена psu.ru

DirContext ictx = new InitialDirContext(env); Attributes attrs = ictx.getAttributes(name, new String[] {"A","MX","CNAME"}); if (attrs.get("a") != null) { out += " ip-адрес: " + attrs.get("a"); }       if (attrs.get("mx") != null) { out += " почта: " + attrs.get("mx"); }       if (attrs.get("cname") != null) { out += " canonical name: " + attrs.get("cname"); }

return "Результат: " + out; } }

Этот класс будем вызывать из jsp-страницы, со следующим содержимым: <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="jperm.DNSResolver" %> <% String name = request.getParameter("name"); %> <% String lastname = ""; Cookie cookies[] = request.getCookies; if (cookies != null && name == null) { for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName.equals("name")) { lastname = cookies[i].getValue; break; }     }    } %>

<!DOCTYPE html>  DNS Resolver Хотим знать ip-адрес по доменному имени <% if (name == null) { %>  ip-адрес для доменного имени "/> <% } else { %> <%= DNSResolver.resolve(name)%> <% response.addCookie(new Cookie ("name",name)); %> <% } %>

Недостатки кода: при каждом запросе DNSResolver.resolve, будет создаваться контекст работы с DNS-сервером. Более логично было бы сделать его статичным. Также не обрабатываются ошибки, связанные с вводом несуществующего DNS-имени или имени в кириллице.

Литература:

Что такое JNDI

Пример работы из JDK