En el JDK 6, Sun/Oracle ha cambiado la implementación de zona horaria. En JDK 5.0, setDefault establece la zona horaria en una variable local de subproceso siempre y no a través de la JVM, lo que ocasionó algunos problemas. Sun reconoció esto como un error y lo corrigió en JDK 1.6.
En el JDK 1.6 en adelante (he comprobado el código fuente tanto para JDK 1.6 y JDK 1.7) si la JVM no se ha iniciado con un controlador de seguridad (o no se establece con System.SetsecurityManager()
), setDefault
método establece que a nivel mundial a través de la JVM y no de una manera específica de hilo. Si desea configurarlo solo para un hilo dado, entonces debe iniciar JVM con un administrador de seguridad.
Cuando inicie Tomcat JVM con un administrador de seguridad, debe proporcionar permisos individuales que no nos servían para nada, ya que estábamos retrasados en el ciclo de publicación. Por lo tanto, en el archivo de política de seguridad proporcionamos todos los permisos y reemplazamos el administrador de seguridad JAVA predeterminado para denegar selectivamente el acceso de escritura de la zona horaria. Debido al problema de inicialización lenta con la clase Timezone, tuve que llamar al Timezone.getDefault()
en el bloque estático que hace que la clase Timezone se inicialice antes de que el securityManager entre en juego.
Aquí está mi programa de prueba.
archivo test.policy --policy
grant {
permission java.security.AllPermission;
};
- administrador de seguridad personalizado
import java.security.Permission;
import java.util.TimeZone;
public class CustomSecurityManager extends SecurityManager {
static {
TimeZone.getDefault().getDisplayName();
}
public CustomSecurityManager() {
super();
}
public void checkPermission(Permission perm) throws SecurityException,NullPointerException
{
String propertyName = perm.getName();
String actionName = perm.getActions();
if(propertyName != null && actionName != null)
{
if(propertyName.equalsIgnoreCase("user.timezone")
&& actionName.equalsIgnoreCase("write"))
{
throw new SecurityException("Timezone write is not permitted.");
}
}
}
}
- JVM inicio Parámetros
-Djava.security .manager = CustomSecurityManager -Djava.security.po lítica = C: /workspace/test/src/test.policy
Buena pregunta; Me estoy rascando la cabeza en una instalación de Tomcat que tengo donde las marcas de tiempo en los registros de Tomcat están una hora detrás de la hora del sistema. –