代码之家  ›  专栏  ›  技术社区  ›  Dan Polites

如何在ApacheTomcat中创建“别名”?

  •  10
  • Dan Polites  · 技术社区  · 16 年前

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

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

    <?xml version="1.0" encoding="UTF-8"?>
    <Context docBase    = "e:\uploads\attachments"
         reloadable = "true"
         crossContext   = "true">
    </Context>
    
    3 回复  |  直到 10 年前
        1
  •  9
  •   Dan Polites    16 年前

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

    可以嵌套一个或多个上下文 此宿主元素中的元素, 每一个代表不同的网络 虚拟主机。

    文件位于 . Tomcat配置了 本地服务器 作为默认主机。因此,如果我们添加 附件.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服务器的别名的最接近的方法。

        2
  •  7
  •   Olaf Kock    16 年前

    有多种选择。

    1. 在您自己的应用程序中提供一个下载servlet,为请求的文件提供服务
    2. 创建您希望tomcat交付web应用程序的目录

    每种方法都有一些缺点和优点。出于多种原因,我非常喜欢第一种解决方案:

    • 我的主要原因适用于unixoid系统,您显然没有提到这一点:只有root用户可以绑定低于1024的端口,例如80。因此,tomcat需要以root身份运行(我知道有一些机制允许用户绑定到低端端口,但我从未使用过它们)。Apache通常以root用户身份启动,但一旦绑定端口80,就会放弃这些特权。
    • 显然,您知道如何在apache中创建别名——这样做很简单。

    • 如果需要,您可以轻松执行权限检查(例如,下载时需要登录)
    • 下载servlet很简单-找到文件,在输出流中设置文件名和文件类型,并逐字节流式传输,然后关闭输出流(确保处理攻击文件名,如“/download/../../../../../../../etc/passwd”或“/download/C:/WINDOWS/someimportantfile.xxx”),例如,通过使用java.io.File构造函数,将基本目录作为单独的参数获取。

    第三个选项有一些严重的缺点,如果您不特别注意,它会让您面临攻击:

    • Tomcat不提供目录,但提供webapps。因此,“E:/upload/attachments”至少需要一个名为“WEB-INF”的目录,其中包含“WEB.xml”。注意不要从上载web应用程序提供对此目录和文件的写访问。有了这个规定,您可以让tomcat提供目录服务。
    • <% System.exit(0); %> 或更多恶意内容。

    还有一个想法:你不需要额外的钱 crosscontext="true" . 这意味着您部署用于服务您的文件的Web应用程序可以访问其他Web应用程序,例如,可以管理它们或访问它们的私有数据。通常你根本不需要,在你的问题上,你肯定不想要。

        3
  •  2
  •   Community CDub    8 年前

    有关通过编辑context.xml文件来实现这一点的方法,请参见我新问题的初始部分 How do I add aliases to a Servlet Context in java? . 根据一些人的说法,出于性能原因,不再需要(2012年:Tomcat 6或7)使用Apache而不是Tomcat来提供静态内容。

    推荐文章