2009-12-28 25 views
28

Mi último proyecto puede generar documentos con información de una base de datos.Práctica recomendada para almacenar datos temporales para una aplicación web

Así que copio la plantilla de documento bajo demanda en una carpeta temporal para un usuario y la modifico. Hago esto porque cada plantilla debe estar disponible durante la modificación.

A continuación, el usuario recibe su documento a través de un enlace de descarga de mi aplicación web.

Mi pregunta: ¿existe una mejor práctica para almacenar datos de aplicaciones web? Pensé que la temperatura sería agradable para eso. Pero dado que tengo que borrar los datos yo mismo, pensé en colocarlos además de mi carpeta WAR en la carpeta webapp de tomcat.

Uso Windows 2003 como sistema host con Tomcat. Uso Grails, Java y Maven para mi proyecto ... no sé si esta información es necesaria.

Editar:
razón principal por la que hago esta pregunta es trivial ... si tomo el cuidado de la creación/eliminación de mis datos temporales ... ¿sigue siendo una buena práctica utilizar la carpeta temporal en el sistema? No estoy seguro de esto ...

Respuesta

33

Al almacenar archivos (sensibles) específicos del usuario en aplicación de web, asegúrese de guardarlo en algún lugar de /WEB-INF y acceder a ellos con un Servlet la que (indirectamente) comprueba el usuario conectado, de lo contrario, es accesible para cualquier usuario/hacker en la red mundial. La ventaja es que es fácilmente accesible mediante programación en ServletContext#getResource() o #getRealPath(). La desventaja es que se perderán cada vez que vuelvas a desplegar la aplicación web.

También puede almacenarlos en la carpeta temporal predeterminada. La ventaja es que es accesible por API estándar como File#createTempFile() o System.getProperty("java.io.tmpdir"). La carpeta temporal tiene la desventaja de que la limpieza de carpetas controlada por el sistema operativo no se puede controlar desde Java, por lo que puede arriesgarse a que se pierda cada vez que cierre el recurso, pero aún así lo necesitará más adelante.

También puede almacenarlos en una carpeta fija fuera de la aplicación web. Tiene la ventaja de que las cosas no se pierden cada vez que vuelves a desplegar la aplicación web. La desventaja es que debe crear la carpeta usted mismo con suficientes derechos de sistema operativo, que pueden no ser aplicables en hosts de terceros.

La limpieza de sus propios recursos temporales ciertamente le pertenece a las tareas que necesita hacer usted mismo. No lo consideraría una preocupación.

Simplemente superan las ventajas/desventajas.

+0

yo no era consciente de que el sistema operativo puede decidir para limpiar la carpeta temporal. Puedes profundizar sobre eso? –

+1

La mayoría de los sistemas de servidor ejecutan un trabajo cron una vez al día/semana/mes, lo que elimina todos los archivos anteriores a N días de/tmp. Esto es para asegurarse de que el espacio en disco no se agote porque alguien olvidó limpiar después de ellos. –

+1

@EliAcherkan: 'tmp' debe sonar de todos modos –

5

Creo que los archivos temporales pertenecen a una carpeta temporal. En su caso, usted borra los archivos usted mismo, pero ¿qué pasa si hay un error en la operación de eliminación de archivos? ¿O qué pasa si se cierra el servidor antes de que se eliminen los archivos? Si escribe en una carpeta temporal, hay al menos alguna esperanza de que los archivos se limpiarán más tarde (manualmente o mediante algún proceso).

Incluso cuando una aplicación desea almacenar datos persistentes (es decir, no temporales), creo que todavía no debe almacenarse en el directorio de Tomcat, porque esos directorios tienden a borrarse o sobrescribirse cada vez que implementa una nueva versión de su aplicación (o incluso instalar una nueva versión de Tomcat).

métodos útiles:

12
  • Almacenamiento de información dentro de la carpeta de aplicaciones web no siempre funciona. Algunos servidores de aplicaciones no expanden el archivo WAR implementado y, por lo tanto, no existe un "directorio de trabajo" para una aplicación web. Algunos administradores de sistemas también impiden el acceso al sistema de archivos de aplicaciones web (que depende de las políticas del administrador de seguridad).
  • Se deben usar archivos temporales para, bueno, datos temporales. Datos que pueden ser reconstruidos a pedido. No use archivos temporales que los usuarios deberían descargar. P.ej. Cuando su sistema piensa que debe limpiar archivos temporales o cuando reinicia el servidor de aplicaciones, el usuario aún desea descargar estos archivos, aunque podrían eliminarse mientras tanto.
  • El lugar correcto para almacenar dichos datos es la base de datos. Sus documentos no son realmente temporales en el medio de los archivos temporales. Use una base de datos para almacenar los documentos y use la base de datos como un caché para documentos. Luego puede implementar su propia estrategia de limpieza. También sirve como un almacenamiento persistente, por lo que no tiene que preocuparse por los reinicios del servidor. Además, puede tener metadatos adicionales allí, como la última hora de acceso o un contador de acceso y facilitar fácilmente al usuario una lista de documentos que creó. Si su biblioteca de procesamiento de documentos requiere un java.io.File para la manipulación, solo entonces guarde el documento de la base de datos en un archivo temporal, inicie el procesamiento y vuelva a leerlo en la base de datos.
6

Un contenedor web proporciona un atributo de contexto que apunta a un directorio temporal: se requiere

Un directorio de almacenamiento

servlet especificación SRV.3.7.1 Directorios de Trabajo Temporal

temporal para cada contexto servlet. Los contenedores Servlet deben proporcionar un directorio temporal privado por contexto de servlet y hacer que esté disponible a través del atributo de contexto ServletContext.TEMPDIR ( javax.servlet.context.tempdir). Los objetos asociados con el atributo deben ser del tipo java.io.File.

Ejemplo:

File appTempDir = getServletContext().getAttribute(ServletContext.TEMPDIR); 
File tempFile = File.createTempFile("process1", ".txt", appTempDir); 
tempFile.deleteOnExit(); 
try { 
    ... 
} finally { 
    tempFile.delete(); 
} 
+2

Solo para agregar a esto: Usando 'File tmpDir = (File) getServletContext(). GetAttribute (ServletContext.TEMPDIR);' obtendrá el directorio de archivos temporales para la aplicación web actual proporcionada por el contenedor de servlets. – megaflop

+0

Este código no parece ser válido ... – Jeef

+0

@Jeef ¿Por qué crees que es así? – dajood

Cuestiones relacionadas