Средство просмотра кэша DNS Java

В заключение когда Вы используете локальную переменную типа, который реализует IDisposable, всегда , без исключения, используйте using 1 глоток>.

, Если Вы используете нелокальный IDisposable, переменные, тогда всегда реализуют IDisposable шаблон .

Два простых правила, никакое исключение 1 глоток>. Предотвращение утечек ресурсов иначе является реальной болью в *ss.

1) глоток>: единственным исключением является †“В, когда Вы обрабатываете исключения. Это могло бы тогда быть меньше кода для вызова Dispose явно в finally блок.

18
задан Chandra Patni 2 December 2009 в 20:03
поделиться

2 ответа

Вот сценарий для печати кэша положительных и отрицательных адресов DNS.

import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class DNSCache {
  public static void main(String[] args) throws Exception {
    InetAddress.getByName("stackoverflow.com");
    InetAddress.getByName("www.google.com");
    InetAddress.getByName("www.yahoo.com");
    InetAddress.getByName("www.example.com");
    try {
        InetAddress.getByName("nowhere.example.com");
    } catch (UnknownHostException e) {

    }

    String addressCache = "addressCache";
    System.out.println(addressCache);
    printDNSCache(addressCache);
    String negativeCache = "negativeCache";
    System.out.println(negativeCache);
    printDNSCache(negativeCache);
  }
  private static void printDNSCache(String cacheName) throws Exception {
    Class<InetAddress> klass = InetAddress.class;
    Field acf = klass.getDeclaredField(cacheName);
    acf.setAccessible(true);
    Object addressCache = acf.get(null);
    Class cacheKlass = addressCache.getClass();
    Field cf = cacheKlass.getDeclaredField("cache");
    cf.setAccessible(true);
    Map<String, Object> cache = (Map<String, Object>) cf.get(addressCache);
    for (Map.Entry<String, Object> hi : cache.entrySet()) {
        Object cacheEntry = hi.getValue();
        Class cacheEntryKlass = cacheEntry.getClass();
        Field expf = cacheEntryKlass.getDeclaredField("expiration");
        expf.setAccessible(true);
        long expires = (Long) expf.get(cacheEntry);

        Field af = cacheEntryKlass.getDeclaredField("address");
        af.setAccessible(true);
        InetAddress[] addresses = (InetAddress[]) af.get(cacheEntry);
        List<String> ads = new ArrayList<String>(addresses.length);
        for (InetAddress address : addresses) {
            ads.add(address.getHostAddress());
        }

        System.out.println(hi.getKey() + " "+new Date(expires) +" " +ads);
    }
  }
}
19
ответ дан 30 November 2019 в 07:08
поделиться

java.net.InetAddress использует кеширование успешных и неудачных разрешений имен хостов.

Из его javadoc:

Класс InetAddress имеет кеш для магазин успешен, а также неудачное разрешение имени хоста.

По умолчанию, когда менеджер безопасности установлен, чтобы защитить от Атаки с подменой DNS, результат положительные разрешения имени хоста кешируется навсегда. Когда безопасность менеджер не установлен, по умолчанию поведение заключается в кэшировании записей для конечный (зависит от реализации) промежуток времени. Результат неудачное разрешение имени хоста кешируется на очень короткий период времени (10 секунд) для повышения производительности.

Если поведение по умолчанию не желательно, тогда свойство безопасности Java можно установить другое время жизни (TTL) значение для положительного кэширования. Точно так же системный администратор может настроить другое отрицательное значение TTL кэширования при необходимости.

Два управляющих свойства безопасности Java значения TTL, используемые для положительных и отрицательное кэширование разрешения имени хоста:

  • networkaddress.cache.ttl
    Указывает политику кэширования для успешный поиск имени по имени служба. Значение указано как целое число для обозначения количества секунд для кеширования успешного Погляди. По умолчанию установлено значение кеш для конкретной реализации период времени.

    Значение -1 указывает "кэш навсегда ".

  • networkaddress.cache.negative.ttl (по умолчанию: 10)
    Указывает на кеширование политика для неудачных поисков имени от имени службы. Ценность указано как целое число, чтобы указать количество секунд для кеширования сбой при неудачных поисках.

    Значение 0 указывает, что «никогда не кэшировать». Значение -1 указывает "кеш навсегда ».

Если вы имеете в виду сброс кешей (типа java.net.InetAddress $ Cache ), используемых java.net.InetAddress , они являются внутренними детали реализации и, следовательно, private :

/*
 * Cached addresses - our own litle nis, not!
 */
private static Cache addressCache = new Cache(Cache.Type.Positive);

private static Cache negativeCache = new Cache(Cache.Type.Negative);

Поэтому я сомневаюсь, что вы найдете что-нибудь, делающее это из коробки, и предполагаю, что вам придется поиграться с отражением, чтобы достичь своей цели.

17
ответ дан 30 November 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: