2010-11-04 28 views
6

Sé que el objeto de solicitud tiene una función para obtener el nombre del servidor. (es decir, HttpServletRequest.getServerName())Obtener el nombre del servidor durante la inicialización del servlet

¿Qué sucede si necesito la misma funcionalidad dentro de la inicialización de un servlet? ¿Cómo hago esto?

+2

¿Hay algún problema/problema si invoco java.net.InetAddress.getLocalHost(). GetCanonicalHostName() para obtener el nombre del servidor? –

+0

sí, cuando tiene nombres de alias para su host. Por ejemplo, su aplicación puede ser visible en 'http: // www.google.com /' mientras usa 'getCanonicalHostName()' puede darle 'http: // nuq05s02-in-f18.1e100.net /' –

Respuesta

4

Esta información se basa en la solicitud y no se basa estrictamente en la aplicación. Puede cambiar, por solicitud. Todo lo que tiene a mano durante la inicialización del servlet es la instancia ServletContext que a su vez ofrece métodos como getInitParameter(). Puede usarlo para acceder a la configuración de toda la aplicación.

así que lo mejor es configurar manualmente el nombre del servidor como un parámetro de contexto en web.xml

<context-param> 
    <param-name>serverName</param-name> 
    <param-value>foo</param-value> 
<context-param> 

para que pueda obtener de la siguiente manera en init() método del servlet:

String serverName = getServletContext().getInitParameter("serverName"); 

Otro (no recomendado) la alternativa es establecerlo como nombre para mostrar en web.xml

<display-name>foo</display-name> 

para que pueda obtener de la siguiente manera:

String serverName = getServletContext().getServletContextName(); 
0

Creo que eso no es posible. Un host puede tener varios nombres. ¿Cuál debería ser devuelto? Y es posible que el host ni siquiera conozca todos los nombres configurados en DNS.

+0

Creo que asker quiere obtener el mismo valor de HttpServletRequest.getServerName() pero de un HttpServlet genérico. Hay un comportamiento estándar para que nombre regrese. –

+0

El HttpServletRequest contiene un nombre de servidor porque el navegador web lo envía. En la inicialización del servlet no hay ninguna solicitud para leer el nombre del servidor. – MForster

3

Si por alguna razón usted no desea utilizar la respuesta de BalusC, y que no es necesario el nombre inmediatamente, puede hacerlo con pereza. El otro día he implementado un escenario similar de esa manera:.

private volatile boolean initialized; 

public void doGet(..) { 
    if (!initialized) { 
     synchronized(this) { 
      if (!initialized) { 
       initialize(request.getServerName()) 
      } 
     } 
    } 
} 

(. La doble comprobación de bloqueo para lazy-inicialización se puede implementar de varias maneras See wikipedia)

0

InetAddress.getLocalHost() getHostName()

Cuestiones relacionadas