Java 为webapp存储临时数据的最佳做法

Java 为webapp存储临时数据的最佳做法,java,tomcat,grails,Java,Tomcat,Grails,我的最新项目能够从数据库生成包含信息的文档 因此,我根据需要将文档模板复制到用户的临时文件夹中,并对其进行修改。我这样做是因为在修改期间每个模板都必须可用 之后,用户将通过我的webapp的下载链接获得其文档 我的问题:是否有存储webapp数据的最佳实践?我想临时工会很好的。但是由于我必须自己删除数据,我想把它放在TomcatWebApp文件夹中的WAR文件夹之外 我使用Windows 2003作为Tomcat的主机系统。我的项目使用Grails、Java和Maven……不知道是否需要这些信息

我的最新项目能够从数据库生成包含信息的文档

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

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

我的问题:是否有存储webapp数据的最佳实践?我想临时工会很好的。但是由于我必须自己删除数据,我想把它放在TomcatWebApp文件夹中的WAR文件夹之外

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

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

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

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

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

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


我认为临时文件应该放在临时文件夹中。在您的情况下,您自己删除文件,但是如果文件删除操作中有错误怎么办?或者,如果在删除文件之前服务器关闭了怎么办?如果写入临时文件夹,则至少有希望稍后(手动或通过某些过程)清理这些文件

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

有用的方法:

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

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

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

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

      我不知道操作系统可以决定清理临时文件夹。你能详细说明一下吗?大多数服务器系统每天/每周/每月运行一次cron作业,从/tmp中删除所有超过N天的文件。这是为了确保磁盘空间不会因为有人忘记清理自己而耗尽。@EliAcherkan:
      tmp
      应该会敲响警钟不管怎样,只向数据库写入而不保存临时文件有什么好处吗?只需添加一点:使用
      file tmpDir=(file)getServletContext().getAttribute(ServletContext.TEMPDIR)
      将为servlet容器提供的当前webapp获取临时文件目录。此代码似乎无效…@Jeef您为什么这么认为?因为它运行时会在为Tomcat C:\Daten\apache-t提供的jsp中抛出错误