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

标签 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 之外创建文件,并且仍然保证它们的安全。

最佳答案

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

附注您仍然可以进行一些“计划的”清理,以防生成的文件从未下载。

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

当您的案例中有外部文件夹时,我没有发现任何安全问题。此外部文件夹只能在您的应用程序中访问。

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

  1. 在您的网络应用程序中创建知道您的FilesRootDir位置的servlet
  2. 假设 servlet 映射到以下网址 (/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 应用与应用程序中相同的安全约束,因为它是应用程序的一部分。

关于java - 在服务器中公开生成的文件的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082313/

相关文章:

java - 小程序卡在加载中

java - 在 RobotFramework 上创建 java 测试而不运行它

java - Eclipse 调试器在包行处停止

javascript - 样式战斧上传文件组件

python - 从 django 的查询集中获取第一个对象的最快方法?

"SVG Tiny 1.2"在当今的移动和桌面浏览器中有何性能优势?

java - 自定义 JSF 组件。使用 UIComponentELTag 时

java - 使 JSplitPane 完全透明

java - Spring Web App + JPA 没有可用的事务性 EntityManager

mysql - 将 S3 数据加载到 Aurora MySQL 实例中