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

Posted

技术标签:

【中文标题】如何在 Apache Tomcat 中创建“别名”?【英文标题】:How do you create "Aliases" in Apache Tomcat? 【发布时间】:2010-09-25 22:33:23 【问题描述】:

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

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

attachments.xml:

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

【问题讨论】:

【参考方案1】:

请参阅我的新问题的初始部分,了解如何通过编辑 context.xml 文件来做到这一点 How do I add aliases to a Servlet Context in java?。 现在有几个人表示,出于性能原因,不再需要(2012 年:Tomcat 6 或 7)使用 Apache 而非 Tomcat 来提供静态内容。

【讨论】:

补充保卢斯指出的内容。现在可以为 Tomcat 7 定义别名。如果您正在运行此版本,documenation 应该值得一看。可以串起来aliases="/shared=/[path to]/shared,/app1a=/[path to]/app1a"【参考方案2】:

有多种选择。

    使用 Apache 作为前端,通过 mod_jk 或 mod_proxy 委托给 tomcat 在您自己的应用程序中提供下载 servlet,为请求的文件提供服务 创建您希望 tomcat 交付 Web 应用程序的目录

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

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

关于下载servlet:

这样你就有一个 servlet 为你的静态资源提供服务,你可以将它绑定到 URL“/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 文件,还会执行它们。想象一下有人上传带有&lt;% System.exit(0); %&gt; 或更多恶意内容的“index.jsp”。

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

【讨论】:

【参考方案3】:

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

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

虚拟主机存储在 CATALINA_HOME\confserver.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 天以上的解决方案。这有效!

以上是关于如何在 Apache Tomcat 中创建“别名”?的主要内容,如果未能解决你的问题,请参考以下文章

如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?

使用 Apache Tomcat 在 Eclipse 中创建 JSP 文件

如何在 C# 中创建别名

如何在 MySQL 中创建表别名

如何在 Java 中创建一些变量类型别名

如何在 IBM Websphere MQ 中创建指向队列的别名主题?