在服务器中公开生成的文件的有效方法?

时间:2013-04-18 11:58:12

标签: java performance jsf-2 jboss5.x java-ee-5

我正在研究在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之外创建文件并仍然使它们安全。

2 个答案:

答案 0 :(得分:2)

  • 在服务器上的webapp之外使用一些预先配置的文件夹。正如之前在评论中提到的那样,在WEB-INF
  • 中生成它们并不是一个好主意
  • 创建将从预配置文件夹
  • 向用户提供所请求文件内容的servlet
  • 如果需要,您还可以保护servlet
  • servlet也可以在文件交付给用户后立即将其删除
  • 或者,您可以map external folder进入webapp并让JBoss将其作为静态内容提供(但如果需要,您需要保护访问权限)

P.S。如果永远不会下载生成的文件,您仍可以进行一些“预定”清理。

提供内容的Servlet (回答您的评论)

在您的案例中使用外部文件夹时,我没有看到安全性方面的任何问题。此外部文件夹只能在您的应用程序中访问。

假设您有一个生成文件的目录( FilesRootDir ) - / var / myapp / storage / tmp。

  1. 在您的webapp中创建知道 FilesRootDir
  2. 位置的servlet
  3. 假设servlet映射到以下url(/ mywebapp / downloads / file)
  4. 为了简单起见,您的servlet作为参数接收生成文件的相对路径(路径
  5. 采取以上措施
    1. 该应用程序在此处生成文件/var/myapp/storage/tmp/dir1/document.csv
    2. 并生成链接/mywebapp/downloads/file?path=/dir1/document.csv,以便用户可以下载文件
  6. 当用户决定下载文件时,请求由servlet处理。
    1. servlet接收所请求文件的位置 - /dir1/document.csv
    2. 构造连接 FilesRootDir 路径参数的绝对路径 - /var/myapp/storage/tmp/dir1/document.csv
    3. 读取文件内容并将其输出给用户
  7. 我相信您可以像在应用程序中一样对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年 猜测像这样的文件的哈希值。