我正在开发一个允许用户上传附件的Web应用程序.这些附件存储在与Web应用程序不同的驱动器上.如何为此驱动器创建别名(相当于Apache HTTP服务器的别名),以便用户可以下载这些附件?
目前我正在创建一个上下文文件并将其转储到CATALINA_HOME/conf/Catalina/localhost中,但它会经常随机删除.上下文文件名为attachments.xml,内容如下所示.我也读过关于虚拟主机的内容,但如果我理解正确,那么虚拟主机就不是我想要的了.我使用的是Apache Tomcat 6.0.18版.
attachments.xml:
Dan Polites.. 9
我花了很多时间研究这个并找到了一个解决方案来解决随机删除的上下文文件.我在主机配置部分的Apache网站上找到了这个摘录:
您可以在此Host元素中嵌套一个或多个Context元素,每个元素表示与此虚拟主机关联的不同Web应用程序.
虚拟主机存储在位于CATALINA_HOME\conf的server.xml文件中.Tomcat配置了localhost作为默认主机.因此,如果我们从第一篇文章中添加attachments.xml的内容,我们将得到以下内容:
我认为这与定义类似于Apache的HTTP服务器的别名非常接近.
我花了很多时间研究这个并找到了一个解决方案来解决随机删除的上下文文件.我在主机配置部分的Apache网站上找到了这个摘录:
您可以在此Host元素中嵌套一个或多个Context元素,每个元素表示与此虚拟主机关联的不同Web应用程序.
虚拟主机存储在位于CATALINA_HOME\conf的server.xml文件中.Tomcat配置了localhost作为默认主机.因此,如果我们从第一篇文章中添加attachments.xml的内容,我们将得到以下内容:
我认为这与定义类似于Apache的HTTP服务器的别名非常接近.
有多种选择.
使用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文件而是执行它们.想象一下有人上传带有<% System.exit(0); %>
或更多恶意内容的"index.jsp" .
另外一个想法:你不需要额外的crosscontext="true"
.这意味着您为部署文件而部署的Web应用程序可以访问其他Web应用程序,例如能够管理它们或访问其私有数据.通常你根本不需要它,在你的问题的情况下,你绝对不希望这样.