2

我正在开发一个在 JBoss5.1、JEE5、JSF2、Spring3.0、Icefaces2.0、HTML 和 Jquery1.8 上运行的应用程序。

我需要即时生成文件供客户下载。生成文件时,目前我将文件内容作为字节流式传输到 JSF 页面并<ice:outputResource>用于显示下载链接。这适用于较小的文件。随着文件大小的增加,这不是一个好的解决方案,因为我遇到了OutOfMemoryError问题,因为应用程序 JVM 必须承担将文件内容放入堆然后通过应用程序汇集的负担。

我想做的是将生成的文件作为直接链接提供,以便它们可以由通过 HTTP 包含的网络提供服务。我有一个在安全环境中执行此操作的限制,以便用户在生成和查看链接之前进行身份验证。所以,我打算在 WEB-INF 目录中生成文件,并在用户下载后立即删除文件,从而有效地使 WEB-INF 仅包含客户当前正在查看的文件。我不确定JBoss 服务器在缓存方面如何处理这些文件以及是否会影响服务器性能。另外,如果有任何替代方法可以解决我的问题,我将不胜感激。

我相信我清楚地描述了我的问题,如果没有,请告诉我。提前感谢您的时间和帮助。

PS - 我什至可以在 WEB-INF 之外创建文件并且仍然保证它们的安全。

4

2 回答 2

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

PS,如果生成的文件永远不会下载,你可能仍然会做一些“预定的”清理工作。

服务内容的 Servlet(回答您的评论)

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

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

  1. 在您的 web 应用程序中创建知道FilesRootDir位置的 servlet
  2. 假设 servlet 映射到以下 url (/mywebapp/downloads/file)
  3. 为简单起见,您的 servlet 接收生成文件的相对路径(路径)作为参数
  4. 采取以上
    1. 该应用程序在此处生成文件 /var/myapp/storage/tmp/dir1/document.csv
    2. 并生成链接/mywebapp/downloads/file?path=/dir1/document.csv,以便用户下载文件
  5. 当用户决定下载文件时,该请求由您的 servlet 处理。
    1. servlet 接收请求文件的位置 - /dir1/document.csv
    2. 构造连接FilesRootDir路径参数的绝对路径- /var/myapp/storage/tmp/dir1/document.csv
    3. 读取文件内容并将其输出给用户

我相信您可以对您的 servlet 应用与应用程序中相同的安全约束,因为它是应用程序的一部分。

于 2013-04-18T12:21:00.047 回答
0

提供内容,但对服务器中公开的公共文件使用长哈希,例如对于 file image.jpg,使用这样的 URL:

http://yourserver.com/somepath/bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI

将哈希值保存bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI在数据库中并将其与文件相关联image.jpg,换句话说:

hashfunction('image.jpg') = 'bNKq9Ro_UZeesmQlVs9OQkrKVlpxzpzPXf9DCTbqe_FbLczI

一台计算机大约需要 3 TRESSIGINTILLION 年才能猜出这样一个文件的哈希值。

于 2017-04-19T00:12:35.567 回答