【发布时间】:2015-11-27 01:36:43
【问题描述】:
我有一个简单的网络应用程序,允许用户上传和访问文件。当用户访问上传的文件时,服务器需要支持所有的 header 类型,例如 Accept-Ranges,以便可以对大型媒体文件进行部分内容响应。 DefaultServlet(在 Tomcat 中)在 doGet() 调用的 serveResource() 方法中很好地处理了所有内容,因此我想将 DefaultServlet 用于上传的文件。在正常情况下这很容易,因为它是默认 servlet,但不幸的是,对于我来说,我无法找到使用默认 servlet 的方法。
为了防止重新部署webapp时上传的文件被删除,我需要将它们存储在webapp目录之外。 这些文件应该只有上传它们的用户才能访问,所以我创建了一个 javax.servlet.Filter 来处理资源访问授权。我知道如果我在 server.xml 中为外部资源目录添加一个新的上下文,它们将是可访问的,并且将使用 DefaultServlet。
<Context docBase="/path/to/resources" path="/resource" />
但我不想这样做,因为我需要侵入性地修改不推荐的 server.xml (for reasons),并且当 /resource 路径存在上下文时,我的过滤器用于该 url-mapping不会被调用。所以我不认为创建一个新的上下文是一个好的解决方案。
我能想到的唯一其他解决方案是为“/resource/*”处的所有请求创建一个 servlet,该 servlet 扩展了 DefaultServlet,并以某种方式覆盖了在其实际外部位置获取请求文件而不是返回的功能在 webapp 中不存在的资源上出现 404。 但是,我还没有找到一种简单的方法将 DefaultServlet 转换为可以获取 webapp 目录外部文件的方法。也许有办法?
我将如何处理这个问题?
【问题讨论】:
-
你的 Tomcat 版本是多少?
-
我正在运行 Tomcat v7.0.42
-
你考虑过this吗?