如何在Apache Tomcat中创建“别名”?

时间:2008-12-08 21:08:49

标签: apache tomcat aliases context.xml

我正在开发一个允许用户上传附件的Web应用程序。这些附件存储在与Web应用程序不同的驱动器上。如何为此驱动器创建别名(相当于Apache HTTP服务器的别名),以便用户可以下载这些附件?

目前我正在创建一个上下文文件并将其转储到CATALINA_HOME / conf / Catalina / localhost中,但它会经常随机删除。上下文文件名为attachments.xml,内容如下所示。我也读过有关虚拟主机的内容,但如果我理解正确,那么虚拟主机就不是我想要的了。我使用的是Apache Tomcat 6.0.18版。

attachments.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase    = "e:\uploads\attachments"
     reloadable = "true"
     crossContext   = "true">
</Context>

3 个答案:

答案 0 :(得分:9)

我花了很多时间研究这个并找到了一个解决方案来解决随机删除的上下文文件。我在Apache的网站上在主机配置部分找到了这段摘录:

  

您可以嵌套一个或多个上下文   这个Host元素中的元素,   每个代表一个不同的网站   与此相关的应用程序   虚拟主机。

虚拟主机存储在位于 CATALINA_HOME \ conf server.xml 文件中。 Tomcat配置了 localhost 作为默认主机。因此,如果我们从第一篇文章中添加 attachments.xml 的内容,我们将获得以下内容:

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

    <Context path="/attachments"
             docBase="e:\uploads\attachments"
             reloadable="true"
             crossContext="true" />
</Host>

我认为这与定义类似于Apache的HTTP服务器的别名非常接近。

答案 1 :(得分:7)

有多种选择。

  1. 使用Apache作为前端,通过mod_jk或mod_proxy
  2. 委托给tomcat
  3. 在您自己的应用程序中提供下载servlet,提供所请求的文件
  4. 创建您希望tomcat提供Web应用程序的目录
  5. 每个都有一些缺点和一些优点。出于多种原因,我非常喜欢第一种解决方案:

    • 我的主要原因适用于unixoid系统,你显然不是在谈论:只有root可以绑定低于1024的端口,例如: 80.因此tomcat需要以root身份运行(我知道有一些机制允许用户绑定到低端口,但我从来没有使用它们)。 Apache通常以root身份启动,但只要端口80绑定就会丢弃这些权限。
    • 据说Apache在提供静态资源方面要比tomcat好很多(我从未测量过它,但很难相信相反的情况)
    • 你显然知道如何在apache中创建别名 - 这样做很简单。

    关于下载servlet:

    这样你就有了一个为你的静态资源提供服务的servlet,你可以将它绑定到网址“/ download / *”(例如在同样处理文件上传的应用程序中)你将获得:

    • 您只需配置一次存储文件的目录
    • 如果您需要,可以轻松实施权限检查(例如下载所需的登录)
    • 您只需要部署一个完全自包含的应用程序。
    • 下载servlet很简单 - 找到文件,在输出流中设置它的名称和文件类型并逐字节流,然后关闭输出流(确保处理攻击文件名,如“/download/../” ../../../etc/passwd“或”/download/C:/WINDOWS/someimportantfile.xxx“),例如通过使用java.io.File构造函数将获取基目录作为单独的参数。

    第三种选择有一些严重的缺点,如果你不特别照顾他们就会打开攻击:

    • Tomcat不提供目录,而是提供webapps。因此,“E:/ upload / attachments”至少需要一个名为“WEB-INF”的目录,其中包含“web.xml”。请注意不要从上载Web应用程序提供对此目录和文件的写访问权限。使用此配置,您可以让tomcat提供目录。
    • 但是:将包含的web.xml配置为不作为jsp提供“* .jsp”,否则tomcat不会只提供jsp文件而是执行它们。想象一下,有人使用<% System.exit(0); %>或更多恶意内容上传“index.jsp”。

    另外一个想法:您不需要额外的crosscontext="true"。这意味着您为部署文件而部署的Web应用程序可以访问其他Web应用程序,例如:能够管理或访问他们的私人数据。通常你根本不需要它,如果你的问题你肯定不想要那个。

答案 2 :(得分:2)

通过编辑context.xml文件,查看我的新问题的初始部分,了解如何执行此操作 How do I add aliases to a Servlet Context in java?。 根据现在的几个人的说法,不再需要(2012:Tomcat 6或7)因为性能原因而使用Apache而不是Tomcat来提供静态内容。