【问题标题】:Tomcat use DefaultServlet for static content in external directoryTomcat 对外部目录中的静态内容使用 DefaultServlet
【发布时间】: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吗?

标签: java tomcat servlets


【解决方案1】:

不是答案

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

这意味着你重新部署你的东西是错误的(以一种非常糟糕的方式),可能使用了战争文件,或者更糟(最差)的 tomcat 管理器。

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

你是对的,但你有另一个上下文是错误的,没有必要。

解决方案:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 2011-02-21
    • 2018-09-17
    • 1970-01-01
    • 2011-02-26
    • 2011-04-18
    • 1970-01-01
    • 2018-12-25
    • 2015-08-06
    相关资源
    最近更新 更多