我正在开发一个在 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 之外创建文件,并且仍然保证它们的安全。
最佳答案
- 在服务器上的 web 应用程序之外使用一些预配置的文件夹。正如前面在评论中提到的,在 WEB-INF 中生成它们不是一个好主意
- 创建 servlet,从预配置的文件夹中向用户提供所请求文件的内容
- 如果需要,您还可以保护 servlet
- servlet 还可以在文件交付给用户后立即将其删除
- 或者,您可以 map external folder进入 webapp 并让 JBoss 将它们作为静态内容提供(但如果需要,您需要保护访问)
附注您仍然可以进行一些“计划的”清理,以防生成的文件从未下载。
提供内容的 Servlet(回答您的评论)
当您的案例中有外部文件夹时,我没有发现任何安全问题。此外部文件夹只能在您的应用程序中访问。
假设您有一个生成文件的目录 (FilesRootDir) -/var/myapp/storage/tmp。
- 在您的网络应用程序中创建知道您的FilesRootDir位置的servlet
- 假设 servlet 映射到以下网址 (/mywebapp/downloads/file)
- 为了简单起见,您的 servlet 接收生成文件的相对路径(路径)作为参数
- 采取上述
- 应用程序在此处生成文件/var/myapp/storage/tmp/dir1/document.csv
- 并生成链接/mywebapp/downloads/file?path=/dir1/document.csv,以便用户可以下载该文件
- 当用户决定下载文件时,该请求将由您的 servlet 处理。
- servlet 接收所请求文件的位置 -/dir1/document.csv
- 构造连接FilesRootDir和路径参数的绝对路径 - /var/myapp/storage/tmp/dir1/document.csv<
- 读取文件内容并将其输出给用户
我相信您可以对 servlet 应用与应用程序中相同的安全约束,因为它是应用程序的一部分。
关于java - 在服务器中公开生成的文件的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082313/