Tomcat将DefaultServlet用于外部目录中的静态内容

时间:2015-09-01 17:52:32

标签: java tomcat servlets

我有一个简单的网络应用程序,允许用户上传和访问文件。当用户访问上载文件时,服务器需要支持所有标头类型,例如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的过滤器 - 不会调用--mapping。所以我不认为创建一个新的上下文是一个很好的解决方案。

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

我将如何处理此事?

1 个答案:

答案 0 :(得分:0)

不是答案

  

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

这意味着你正在重新部署你的东西(以非常糟糕的方式),可能使用war文件,或者更糟糕的(最糟糕的)tomcat管理器。

  

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

你是对的,但你错了另一个背景,没有必要。

解决方案:

亲爱的Michael-O指定了最简单且可能是最佳答案。

你也可以实现像DefaultServlet这样的东西,有时(不适合你的情况)从zer0实现的东西更好,而不是配置和维护太多复杂的东西。