我有一个简单的Web应用程序,允许用户上传和访问文件。当用户访问上载的文件时,服务器需要支持所有标头类型,例如Accept-Ranges,以便可以对大型媒体文件进行部分内容响应。 DefaultServlet(在Tomcat中)在doGet()调用的serveResource()方法中可以很好地处理所有事情,因此我想对上载的文件使用DefaultServlet。由于它是DEFAULT servlet,因此在通常情况下这很容易,但是不幸的是,对于我而言,我无法找到使用默认servlet的方法。

为了防止重新部署webapp时删除上传的文件,我需要将它们存储在webapp目录之外。
这些文件只能由上传它们的用户访问,因此我创建了一个javax.servlet.Filter来处理资源访问授权。我知道,如果我在server.xml中为外部资源目录添加新上下文,则可以访问它们,并使用DefaultServlet。

<Context docBase="/path/to/resources" path="/resource" />

但是我不想这样做,因为那样我就需要侵入性地修改不推荐使用的server.xml(for reasons),并且当/ resource路径存在上下文时,将不会调用该URL映射的过滤器。因此,我认为创建一个新的上下文不是一个好的解决方案。

我能想到的唯一其他解决方案是为'/ resource / *'上的所有请求创建一个Servlet,它扩展了DefaultServlet,并以某种方式覆盖了功能,该功能将获得请求的文件,而不是在其实际外部位置上返回404。 Webapp中不存在的资源。
但是,我还没有找到一种简单的方法来将DefaultServlet转换为可以获取webapp目录外部文件的方法。也许有办法吗?

我将如何处理呢?

最佳答案

没有答案

为了防止上传文件被删除时
重新部署了webapp

这意味着您正在错误地(非常糟糕地)重新部署您的东西,可能是使用war文件,或更糟糕的(最差的)tomcat管理器。

我知道如果我在server.xml中为外部添加新的上下文
资源目录,它们将是可访问的,以及DefaultServlet
将会被使用。

您是对的,但是您有其他上下文是错误的,这不是必需的。

解决方案:

尊敬的Michael-O指定了最简单且可能最好的答案。

您也可以实现类似DefaultServlet的东西,有时(不是针对您的情况),最好是从zer0实现而不是配置和维护太多复杂的东西。

07-27 18:46