我正在研究在JBoss5.1,JEE5,JSF2,Spring3.0,Icefaces2.0,HTML和Jquery1.8上运行的应用程序。
我需要动态生成文件供客户下载。生成文件时,目前我将文件内容作为字节串流到JSF页面,并使用<ice:outputResource>
显示要下载的链接。这适用于较小尺寸的文件。随着文件大小的增加,这不是一个好的解决方案,因为我遇到了OutOfMemoryError
问题,因为应用程序JVM必须承担将文件内容放入堆中然后在应用程序中漏斗的负担。
我想要做的是将生成的文件作为直接链接提供,以便它们可以通过HTTP包含的Web服务。我有一个限制,即在安全的环境中执行此操作,以便在用户生成并查看链接之前对其进行身份验证。因此,我计划在用户下载后立即将文件生成到WEB-INF目录并删除文件,从而有效地使WEB-INF仅包含客户当前正在查看的文件。我不确定 JBoss服务器如何在缓存方面处理这些文件,如果影响服务器性能。此外,如果有任何替代方法可以解决我的问题,我感激不尽。
我相信我清楚地描述了我的问题,如果不是,请告诉我。提前感谢您的时间和帮助。
PS - 我甚至可以在WEB-INF之外创建文件并仍然使它们安全。
答案 0 :(得分:2)
P.S。如果永远不会下载生成的文件,您仍可以进行一些“预定”清理。
提供内容的Servlet (回答您的评论)
在您的案例中使用外部文件夹时,我没有看到安全性方面的任何问题。此外部文件夹只能在您的应用程序中访问。
假设您有一个生成文件的目录( FilesRootDir ) - / var / myapp / storage / tmp。
我相信您可以像在应用程序中一样对servlet应用相同的安全性约束,因为它是应用程序的一部分。
答案 1 :(得分:0)
提供内容,但对服务器中公开的公共文件使用长哈希,例如对于文件image.jpg
,请使用类似以下的URL:
http://yourserver.com/somepath/bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI
将哈希bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI
保存在您的数据库中,并将其与文件image.jpg
相关联,换句话说:
hashfunction('image.jpg') = 'bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI
这需要一台计算机大约3个TRESVIGINTILLION年 猜测像这样的文件的哈希值。