存储webapp临时数据的最佳实践

时间:2009-12-28 14:31:19

标签: java tomcat grails

我的最新项目能够使用数据库中的信息生成文档。

因此,我将文档模板按需复制到用户的临时文件夹并进行修改。我这样做是因为在修改过程中每个模板都必须可用。

之后,用户通过我的webapp下载链接获得了他的文档。

我的问题:存储webapp数据是否有最佳实践?我觉得温度会很好。但是因为我必须自己删除数据,所以我想把它放在tomcat webapp文件夹中的WAR文件夹旁边。

我使用Windows 2003作为Tomcat的主机系统。我在项目中使用Grails,Java和Maven ......不知道是否需要这些信息。

修改
我提出这个微不足道的问题的主要原因是......如果我负责创建/删除我的临时数据......在系统上使用临时文件夹仍然是一个好习惯吗? 我不确定这个...

4 个答案:

答案 0 :(得分:34)

在webapp中存储(敏感)特定于用户的文件时,请确保将其存储在/WEB-INF中的某个位置并使用Servlet访问它们(间接)检查登录用户,否则可以访问对于万维网上的任何用户/黑客。优点是ServletContext#getResource()#getRealPath()可以通过编程方式轻松访问它。缺点是,每当您重新部署Web应用程序时,它们都会丢失。

您也可以将它们存储在默认的临时文件夹中。优点是它可以通过File#createTempFile()System.getProperty("java.io.tmpdir")等标准API访问。临时文件夹的缺点是操作系统控制的文件夹清理不能从Java控制,因此每当您关闭资源但以后仍然需要它时,您可能会有丢失的风险。

您还可以将它们存储在webapp之外的固定文件夹中。它的优势在于,无论何时重新部署webapp,这些东西都不会丢失。缺点是您需要自己创建具有足够操作系统权限的文件夹,这可能不适用于第三方主机。

清理自己的临时资源当然属于您自己需要完成的任务。我不认为这是一个问题。

胜过优点/缺点。

答案 1 :(得分:13)

  • 在Web应用程序文件夹中存储信息并不总是有效。某些应用程序服务器不会展开已部署的WAR文件,因此Web应用程序没有“工作目录”。某些sys管理员还会阻止Web应用程序文件系统访问(这取决于安全管理器策略)。
  • 临时文件应该用于临时数据。可以按需重建的数据。不要使用应由用户下载的临时文件。例如。当您的系统认为它应该清理临时文件或重新启动应用程序服务器时,用户仍然希望下载这些文件,尽管它们可能会被删除。
  • 存储此类数据的正确位置是数据库。您的文档在临时文件方面并不是暂时的。使用数据库存储文档并将数据库用作文档的缓存。然后,您可以实施自己的清理策略。它还可用作持久存储,因此您无需担心服务器重新启动。此外,您可以在其中添加其他元数据,例如上次访问时间或访问计数器,并轻松向用户提供他创建的文档列表。如果您的文档处理库需要java.io.File进行操作,则只需将数据库中的文档存储到临时文件中,然后开始处理并将其读回数据库。

答案 2 :(得分:7)

Web容器提供指向临时目录的上下文属性:

Servlet规范SRV.3.7.1临时工作目录

每个servlet上下文都需要一个临时存储目录。 Servlet的 容器必须为每个servlet上下文提供一个私有临时目录,并且make 它可以通过ServletContext.TEMPDIRjavax.servlet.context.tempdir)上下文属性获得。对象 与该属性关联的必须是java.io.File类型。

示例:

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

答案 3 :(得分:5)

我认为临时文件属于临时文件夹。在您的情况下,您自己删除文件,但如果文件删除操作中有错误怎么办?或者如果在删除文件之前关闭服务器怎么办?如果你写一个临时文件夹,至少有一些希望以后(手动或通过某个过程)清理文件。

即使应用程序希望存储持久数据(即非临时数据),我认为它仍然不应存储在Tomcat目录中,因为每当您部署新版本的应用程序时,这些目录都会被删除或覆盖(甚至安装新版本的Tomcat)。

有用的方法: