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

bas*_*neu 28 java grails tomcat

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

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

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

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

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

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

Bal*_*usC 34

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

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

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

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

超过优点/缺点.


mha*_*ler 13

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


web*_*rjn 7

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 只是添加到这个:使用`文件tmpDir =(File)getServletContext().getAttribute(ServletContext.TEMPDIR);`将获取servlet容器提供的当前webapp的临时文件目录. (2认同)

Eli*_*kan 5

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

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

有用的方法: