从 Servlet 以编程方式提供静态内容 - 规范是否有任何可用的或者我应该推出自定义的?

Serving static content programmatically from Servlet - does the spec have anything available or i should roll a custom one?

我有一个数据库,其中包含原始文件名、文件在磁盘上的位置、元数据(如拥有文件的用户)...磁盘上的那些文件名称混乱。当用户请求一个文件时,servlet 会检查他是否被授权,然后以原名发送文件。

在研究该主题时,我发现了几个涉及该问题的案例,但没有针对我的。

基本上有两种解决方案:

  1. 处理 headers 和默认 Servlet 容器不处理的其他内容的自定义 servlet:http://balusc.omnifaces.org/2009/02/fileservlet-supporting-resume-and.html
  2. 然后是使用默认 Servlet 并进行一些路径重新映射的快速简便方法。例如,在 Undertow 中,您配置 Undertow 子系统并在 standalone.xml 中添加文件处理程序,将 http://example.com/content/ 映射到 /some/path/on/disk/with/files .

所以我倾向于解决方案 1,因为解决方案 2 是直接路径重映射,我需要即时更改文件名。

我不想重新发明热水。这两种解决方案都是非标准的。因此,如果我决定将应用程序服务器迁移到 Wildfly 以外的服务器,那将是有问题的。有没有更好的办法?你会如何解决这个问题?

虽然您的问题相当普遍,但不一定针对每一种可能的设计挑战都有基于标准的解决方案。

我认为 #2 解决方案不够用 - 如果两个线程试图同时操作文件怎么办?如果有人得到了文件的 link,他们可以分享吗?

我已经实现了与您的#1 解决方案非常相似的东西 - 关键是即使文件的 link 被泄露,也没有人可以重用 link,因为它需要安全性.您只需 "return" 资源的 401 或 403。

另一种可能性取决于您的托管方式。 Amazon S3 允许您生成一个已签名的 URL,它的生存时间有限。通过这种方式,您的服务器不会直接发送文件。它向前端发送重定向或 URL 以供使用。将生命周期保持在 15 秒左右(取决于您的需要),然后 URL 不再有效。

我相信其他云提供商也有类似的能力。