2010-03-24 16 views
6

ACTUALIZACIÓN:Escribir un servlet que comprueba para ver si existen y los delanteros del JSP a otra JSP si no están

Para aclarar un receptor de error genérico que las capturas de 404 no tiene suficiente granularidad para mí. Necesito hacer esto solo si el jsp está en un directorio particular y solo si el nombre de archivo contiene una cierta cadena.

/ACTUALIZACIÓN

He recibido el encargo de escribir un servlet que intercepta una llamada a y JSP en un directorio específico, compruebe que el archivo existe y si se limita a remitir a ese archivo, si entonces no voy a reenviar a un JSP predeterminado. he configurar el web.xml de la siguiente manera:

<servlet> 
<description>This is the description of my J2EE component</description> 
<display-name>This is the display name of my J2EE component</display-name> 
<servlet-name>CustomJSPListener</servlet-name> 
<servlet-class> ... CustomJSPListener</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
... 
<servlet-mapping> 
    <servlet-name>CustomJSPListener</servlet-name> 
    <url-pattern>/custom/*</url-pattern> 
</servlet-mapping> 

Y el método doGet del servlet es el siguiente:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    logger.debug(String.format("Intercepted a request for an item in the custom directory [%s]",request.getRequestURL().toString())); 
    String requestUri = request.getRequestURI(); 
      // Check that the file name contains a text string 
    if (requestUri.toLowerCase(Locale.UK).contains("someText")){ 
    logger.debug(String.format("We are interested in this file [%s]",requestUri)); 
    File file = new File(requestUri); 
    boolean fileExists = file.exists(); 
    logger.debug(String.format("Checking to see if file [%s] exists [%s].",requestUri,fileExists)); 
        // if the file exists just forward it to the file 
    if (fileExists){ 
    getServletConfig().getServletContext().getRequestDispatcher(
      requestUri).forward(request,response); 
    } else { 
        // Otherwise redirect to default.jsp 
    getServletConfig().getServletContext().getRequestDispatcher(
      "/custom/default.jsp").forward(request,response); 
    } 
    } else { 
        // We aren't responsible for checking this file exists just pass it on to the requeseted jsp 
    getServletConfig().getServletContext().getRequestDispatcher(
      requestUri).forward(request,response); 
    } 
} 

Este parece ser el resultado de un error 500 de Tomcat, creo esto se debe a que el servlet está redirigiendo a la misma carpeta que el servlet vuelve a interceptar, lo que da como resultado un ciclo infinito. ¿Hay una mejor manera de hacer esto? Me hacen creer que podría usar filtros para hacer esto, pero no sé mucho sobre ellos.

Respuesta

8
File file = new File(requestUri); 

Esto está mal. El java.io.File sabe nada sobre el contexto de la aplicación web en la que se está ejecutando. La ruta del archivo será relativa al directorio de trabajo actual, que depende de la forma en que inicie el servidor de aplicaciones. Por ejemplo, puede ser relativo a C:/Tomcat/bin en lugar de la raíz de la webapp como parece esperar. No quieres tener esto.

Utilice ServletContext#getRealPath() para traducir una ruta web relativa a una ruta del sistema de archivos de disco absoluta. El ServletContext está disponible en el servlet por el método heredado getServletContext(). Así, siguiendo debería señalar el archivo correcto:

String absoluteFilePath = getServletContext().getRealPath(requestUri); 
File file = new File(absoluteFilePath); 

if (new File(absoluteFilePath).exists()) { 
    // ... 
} 

O, si el contenedor de destino no se expande la guerra contra el sistema de archivos del disco físico, sino en la memoria, entonces es mejor utilizar ServletContext#getResource():

URL url = getServletContext().getResource(requestUri); 

if (url != null) { 
    // ... 
} 
+0

Gracias, intentaré esto. –

+0

Eso todavía no detiene el problema al ingresar un bucle infinito. –

+1

Agregue ' SOLICITUD' a ''. Por cierto: un filtro es un mejor lugar para esto, puedes poner el mismo código en el 'doFilter()', solo tienes que enviar la solicitud y la respuesta hacia abajo. – BalusC

3

Esto se puede hacer de una manera mucho más fácil y integrada.

web.xml tiene <error-page> elemento. Se puede hacer algo como:

<error-page> 
    <error-code>404</error-code> 
    <location>/pageNotFound.jsp</location> 
<error-page> 
+0

Solo quiero que esto suceda si está en un directorio particular y el nombre del archivo contiene una cierta cadena. Entonces, un catch all 404 no tiene suficiente granularidad para mí. –

+0

Luego vea la respuesta de BalusC. – Bozho

0

Lo que haría sería crear un directorio ficticio para la solicitud de servlet inicial, y luego reenviar al directorio real oa la página de tipo 404. Está emitiendo un reenvío independientemente, ¿por qué no simplemente redirigir a un directorio diferente? Eso evitaría cualquier problema de bucle.

+0

Había pensado en eso pero no puedo hacer eso, debe estar en el mismo directorio que los JSP desafortunadamente. –

Cuestiones relacionadas