如何配置 Tomcat 来服务来自 webapps 之外的外部文件夹的图像?

我怎样才能使用 Tomcat 服务的图像文件从一个公共文件夹以外的网络应用程序?我不想在不同的端口上使用第二个 Apache 文件服务器,因为图像文件是同一个应用程序的一部分。我不想创建一个到 webapps 内部公共文件夹的符号链接,因为我的应用是作为一个 war 文件部署的... 有没有一个更简单的解决方案类似于对 webapps 内部的静态内容使用默认 servlet,对 webapps 外部的静态内容使用默认 servlet

118704 次浏览

你可以有一个重定向 servlet,在你的 web.xml 中你会有:

<servlet>
<servlet-name>images</servlet-name>
<servlet-class>com.example.images.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>images</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>

所有映像都在“/images”中,这将被 servlet 截获。然后,它会读取任何文件夹中的相关文件,并立即将其返回。例如,假设您的 images 文件夹中有一个 gif,c: Server _ Images milie.gif。在网页将是 <img src="http:/example.com/app/images/smilie.gif"...。在 servlet 中,HttpServletRequest.getPathInfo()将生成“/milie.gif”。Servlet 将在文件夹中找到它。

不要将 Tomcat 配置为重定向请求,而是使用 Apache 作为 Apache Tomcat 连接器的前端,这样 Apache 只提供静态内容,同时请求 Tomcat 提供动态内容。

使用 JKmount 指令(或其他指令) ,您可以确切地指定哪些请求被发送到 Tomcat。

对静态内容(如图像)的请求将由 Apache 使用标准的虚拟主机配置直接提供,而 JKMount 指令中定义的其他请求将发送给 Tomcat worker。

我认为这个实现将给您最大的灵活性和对整个应用程序的控制。

您可以将一个图像文件夹部署为一个单独的 webapp,并定义该文件夹在文件系统中的任何位置。

在目录 $CATALINA_HOME/conf/[enginename]/[hostname]/中的 XML 文件中创建 背景元素 其中引擎名可能是“ Catalina”,主机名可能是“ localhost”。

根据想要查看图像的路径 URL 命名文件,因此如果你的 webapp 有路径‘ blog’,你可以将 XML 文件命名为 blog#images.xml,这样你的图像在 example.com/blog/images/上就可以看到了

XML 文件的内容应该是 <Context docBase="/filesystem/path/to/images"/>

小心不要卸载这个 webapp,因为它可能会删除你所有的图片!

在没有一个基于定义 XML 的解决方案对我有效之后,我发现 这个答案非常有用。花了大约一分钟的时间,做了一个小小的代码更改: 我修改了这一行

this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));

进入

this.basePath = getInitParameter("basePath");

多年以后,我们可以在我们的 webapp-servlet.xml文件中使用 Spring Web MVC 执行以下操作:

<mvc:resources mapping="/static/**" location="/static/" />

在 Tomcat 7中,可以使用“ aliases”属性:

此属性提供从中加载此上下文资源的外部位置的列表。别名列表的格式应该是“/aliasPath1 = docBase1,/aliasPath2 = docBase2”,其中 aliasPathN 必须包含一个前导’/’,docBaseN 必须是指向任一个。War 文件或目录。将在第一个 docBaseN 中搜索资源,aliasPathN 是该资源的前导路径段。如果没有这样的别名,那么将以通常的方式搜索资源。如果上下文未部署,这些外部位置将不会被清空。

我就是这样做的,而且效果很好

<context>添加到 tomcat/conf/server.xml文件。

Windows 示例:

<Context docBase="c:\Documents and Settings\The User\images" path="/project/images" />

Linux 例子:

<Context docBase="/var/project/images" path="/project/images" />

像这样(在上下文中) :

<Server port="8025" shutdown="SHUTDOWN">
...
<Service name="Catalina">
...
<Engine defaultHost="localhost" name="Catalina">
...
<Host appBase="webapps"
autoDeploy="false" name="localhost" unpackWARs="true"
xmlNamespaceAware="false" xmlValidation="false">
...
<!--MAGIC LINE GOES HERE-->
<Context  docBase="/var/project/images" path="/project/images" />


</Host>
</Engine>
</Service>
</Server>

这样,你就可以在下面找到这些档案(例如 /var/project/images/NameOfImage.jpg) :

http://localhost:8080/project/images/NameOfImage.jpg

这对于在 tomcat 中服务来自外部 webapps 文件夹的静态内容来说非常简单和直接。

只需像下面这样编辑 $CATALINA _ HOME/config/server.xml 下的 server.xml 并重新启动 tomcat。

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


**<Context docBase="C:\Ankur\testFiles"  path="/companyLogo" />**


<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />


</Host>

在具有两个属性 docBase 和 path 的 host 元素中添加 context 元素。

1) docBase: 表示硬盘驱动器目录 Path: 表示您希望在其上提供静态内容的 uri。

例如: 如果 C: Ankur testFiles 目录中有7.png,那么您可以访问7.png 文件,如下所示:

Http://localhost:8081/companylogo/7.png

有关详细信息,请查看 博客