2009-09-25 90 views
3

我有一个静态html,imgs,Flash内容的文件夹在webapp文件夹之外。现在我正在使用符号链接将该文件夹映射到我的webapp目录中。我遇到的问题是当我取消部署应用程序时,它遵循符号链接并删除所有这些文件。包装默认的servlet,但覆盖默认的webapp路径

我试图实现的解决方案之一是一个特殊的servlet,它包装默认的servlet,但使用不同的相对路径。我很难找到如何以覆盖默认servlet路径的方式来包装默认servlet。

这里是我的工作:

public void doGet(final HttpServletRequest req, final HttpServletResponse resp) 
    throws ServletException, IOException { 
    final RequestDispatcher rd = getServletContext().getNamedDispatcher("default"); 
    final HttpServletRequest wrapped = new HttpServletRequestWrapper(req) { 

     @Override 
     public String getServletPath() { 
      return "/usr/depot/repository"; 
     } 
    }; 

    rd.forward(wrapped, resp); 
} 

回答

2

您可以编写自己的servlet来提供静态内容(这并不困难),也可以尝试扩展而不是包装DefaultServlet。无论采用哪种方式,您的最终servlet都将在web.xml(使用“default”作为servlet-name)时被配置为代替默认值。

也就是说,DefaultServlet只会在webapp上下文中提供静态内容;为了改变你必须创建/绑定到JNDI你自己的ProxyDirContext实例指向外部文件夹,我不确定这是否会工作;其配置过程相当复杂。

尝试覆盖servlet路径不会让你得到任何地方。

0

这不是一个好主意。

Web容器或应用程序服务器可以部署在Web服务器后面,或者您可以简单地将Web服务器与容器结合使用。只要把你的静态文件放在那里,并通过绝对路径引用它们。

真的不需要这种黑客(对不起,但它就是这样)。

无论是或简单地部署他们的Web应用程序。

+0

不幸的是,内容需要在安全过滤器后面进行保护。我们已经为大多数静态内容运行apache httpd,但他的文件夹是特殊的。我同意这是一个黑客攻击。 – Ruggs

1

我们有一个类似的问题,我们需要在多个应用程序中共享由CMS生成的一些文件。如果您不使用Windows,则符号链接是最简单的方法。

我们为CMS和Tomcat设置了2个帐号。这些文件对Tomcat是只读的,因此它不能删除它们。

您也可以编写一个小的Tomcat扩展,以便它可以在多个位置查找文件。看到这个网站,

http://blog.bazoud.com/post/2009/05/12/Multiples-docbases-avec-tomcat

您目前的做法是行不通的。 Tomcat需要在部署缓存中加载所有资源以使其可用。在请求处理中更改它为时已晚。该扩展允许Tomcat从多个目录加载资源。这种方法的缺点是你必须在server/lib中放入一个小的JAR。

+0

我最终决定创建一个映射到特定路径的我自己的serlvet。我一直在使用符号链接,因为这些文件是在多个应用程序节点之间共享的,但必须是可写的。这当然不是理想的解决方案,但根据要求最好。 – Ruggs

3

您可以使用自己的实现重写DefaultServlet。你可以完全将其子类化,它是一个公共类。 Here是DefaultServlet的功能规范,您需要遵守它。

另一方面,你可以忽略DefaultServlet,并为你自己的解决方案,例如可以找到here

0

你可以改变你的web应用环境中不同的路径。下面是这确实差取决于客户端的用户代理是否支持ES6服务的例子:

​​

然而,“ES5”和“ES6”,即使我们使用初始的斜杠,是Web应用程序的普通语境下的子目录。使用此方法无法在上下文目录之外打破。