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

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

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

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

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

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

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

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

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

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

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

超过优点/缺点。

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

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

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

每个servlet上下文都需要一个临时存储目录。 Servlet容器必须为每个servlet上下文提供一个私有临时目录,并通过ServletContext.TEMPDIR ( javax.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(); } 

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

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

有用的方法:

  • java.io.File .createTempFile
  • System .getProperty("java.io.tmpdir")