Según la respuesta de Byron, no puede establecer networkaddress.cache.ttl
o networkaddress.cache.negative.ttl
como Propiedades del sistema mediante el uso de la -D
marca o la llamada System.setProperty
porque estas no son propiedades del sistema, son propiedades de seguridad .
Si desea usar una propiedad del sistema para activar este comportamiento (para que pueda usar la -D
marca o la llamada System.setProperty
), querrá establecer la siguiente propiedad del sistema :
-Dsun.net.inetaddr.ttl=0
Esta propiedad del sistema permitirá el efecto deseado.
Pero tenga en cuenta: si no usa la -D
bandera al iniciar el proceso de JVM y elige llamar a esto desde el código:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Este código debe ejecutarse antes de que cualquier otro código en la JVM intente realizar operaciones de red.
Esto es importante porque, por ejemplo, si llamó Security.setProperty
a un archivo .war y lo implementó .war en Tomcat, esto no funcionaría: Tomcat usa la pila de redes Java para inicializarse mucho antes de que se ejecute su código .war. Debido a esta 'condición de carrera', generalmente es más conveniente usar la -D
bandera al iniciar el proceso de JVM.
Si no usa -Dsun.net.inetaddr.ttl=0
o llama Security.setProperty
, deberá editar $JRE_HOME/lib/security/java.security
y configurar esas propiedades de seguridad en ese archivo, por ejemplo
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Pero preste atención a las advertencias de seguridad en los comentarios sobre esas propiedades. Solo haga esto si está razonablemente seguro de que no es susceptible a ataques de suplantación de DNS .
java.security.Security
(al menos en jdk7)Java tiene un comportamiento de almacenamiento en caché de DNS realmente extraño. Lo mejor que puede hacer es desactivar el almacenamiento en caché de DNS o configurarlo en un número bajo, como 5 segundos.
fuente
System.getSecurityManager()
. Documentos para Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Obviamente, esto se ha corregido en versiones más recientes (SE 6 y 7). Experimento un tiempo máximo de almacenamiento en caché de 30 segundos cuando ejecuto el siguiente fragmento de código mientras observo la actividad del puerto 53 usando tcpdump.
fuente
Para ampliar la respuesta de Byron, creo que debe editar el archivo
java.security
en el%JRE_HOME%\lib\security
directorio para realizar este cambio.Aquí está la sección relevante:
Documentación en el
java.security
archivo aquí .fuente
Para resumir las otras respuestas, en
<jre-path>/lib/security/java.security
puede establecer el valor de la propiedadnetworkaddress.cache.ttl
para ajustar cómo se almacenan en caché las búsquedas de DNS. Tenga en cuenta que esta no es una propiedad del sistema, sino una propiedad de seguridad. Pude configurar esto usando:Esto también se puede establecer mediante la propiedad del sistema,
-Dsun.net.inetaddr.ttl
aunque no anulará una propiedad de seguridad si se establece en otro lugar.También me gustaría agregar que si está viendo este problema con los servicios web en WebSphere, como yo, la configuración
networkaddress.cache.ttl
no será suficiente. Debe establecer la propiedad del sistemadisableWSAddressCaching
entrue
. A diferencia de la propiedad de tiempo de vida, esto se puede configurar como un argumento de JVM o medianteSystem.setProperty
).IBM tiene una publicación bastante detallada sobre cómo WebSphere maneja el almacenamiento en caché de DNS aquí . La pieza relevante de lo anterior es:
fuente
De acuerdo con las propiedades oficiales de Oracle Java ,
sun.net.inetaddr.ttl
es una propiedad específica de implementación de Sun, que "puede que no sea compatible en versiones futuras". "la forma preferida es utilizar la propiedad de seguridad"networkaddress.cache.ttl
.fuente