我的最新项目能够使用数据库中的信息生成文档。
因此,我将文档模板按需复制到用户的临时文件夹并进行修改。我这样做是因为在修改过程中每个模板都必须可用。
之后,用户通过我的webapp下载链接获得了他的文档。
我的问题:存储webapp数据是否有最佳实践?我觉得温度会很好。但是因为我必须自己删除数据,所以我想把它放在tomcat webapp文件夹中的WAR文件夹旁边。
我使用Windows 2003作为Tomcat的主机系统。我在项目中使用Grails,Java和Maven ......不知道是否需要这些信息。
修改
我提出这个微不足道的问题的主要原因是......如果我负责创建/删除我的临时数据......在系统上使用临时文件夹仍然是一个好习惯吗?
我不确定这个...
答案 0 :(得分:34)
在webapp中存储(敏感)特定于用户的文件时,请确保将其存储在/WEB-INF
中的某个位置并使用Servlet
访问它们(间接)检查登录用户,否则可以访问对于万维网上的任何用户/黑客。优点是ServletContext#getResource()
或#getRealPath()
可以通过编程方式轻松访问它。缺点是,每当您重新部署Web应用程序时,它们都会丢失。
您也可以将它们存储在默认的临时文件夹中。优点是它可以通过File#createTempFile()
或System.getProperty("java.io.tmpdir")
等标准API访问。临时文件夹的缺点是操作系统控制的文件夹清理不能从Java控制,因此每当您关闭资源但以后仍然需要它时,您可能会有丢失的风险。
您还可以将它们存储在webapp之外的固定文件夹中。它的优势在于,无论何时重新部署webapp,这些东西都不会丢失。缺点是您需要自己创建具有足够操作系统权限的文件夹,这可能不适用于第三方主机。
清理自己的临时资源当然属于您自己需要完成的任务。我不认为这是一个问题。
胜过优点/缺点。
答案 1 :(得分:13)
java.io.File
进行操作,则只需将数据库中的文档存储到临时文件中,然后开始处理并将其读回数据库。答案 2 :(得分:7)
Web容器提供指向临时目录的上下文属性:
Servlet规范SRV.3.7.1临时工作目录
每个servlet上下文都需要一个临时存储目录。 Servlet的
容器必须为每个servlet上下文提供一个私有临时目录,并且make
它可以通过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();
}
答案 3 :(得分:5)
我认为临时文件属于临时文件夹。在您的情况下,您自己删除文件,但如果文件删除操作中有错误怎么办?或者如果在删除文件之前关闭服务器怎么办?如果你写一个临时文件夹,至少有一些希望以后(手动或通过某个过程)清理文件。
即使应用程序希望存储持久数据(即非临时数据),我认为它仍然不应存储在Tomcat目录中,因为每当您部署新版本的应用程序时,这些目录都会被删除或覆盖(甚至安装新版本的Tomcat)。
有用的方法:
java.io.File
.createTempFile
System
.getProperty("java.io.tmpdir")