在 Web 应用程序中,我想创建一个位于 WEB-INF 目录下的“虚拟目录”。实际上,我试图实现的效果与在应用程序爆炸式运行时在文件系统中创建软链接相同。我试图在(最重要的)weblogic 和(在理想情况下)jetty 中实现这一点。
我知道虚拟目录配置,但是这些配置不适合我的目的,因为我不希望内容直接通过 URL 提供(这就是它存在于 WEB-INF 中的原因)。我在 jetty 或 weblogic 的配置文档中没有找到任何内容,似乎提供了类似的资源解析概念(我尝试将“extraClassPath”添加到 jetty,但没有成功)。作为进一步的背景,应用程序正在使用 spring MVC,视图解析器指向 WEB-INF 下的 JSP
<bean id="myResolverBean"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/foo/baz/" p:suffix=".jsp" />
在查看了 spring 代码后,我确信它在资源加载方面没有做任何事情,是容器 (weblogic/jetty) 解析了路径。我也尝试过使用文件 URI,但似乎容器总是将路径解释为相对于上下文根的路径(即没有绝对路径)。
所以我的问题是,是否可以向 web.xml、服务器配置或 spring 配置添加任何类型的配置指令来实现这一点?
答案1
毫不奇怪,weblogic 中这个问题的答案是虚拟目录。该指令既提供了(我认为的)将 URL 映射到要提供的一组(通常是静态文件)的标准行为,也提供了当路径位于 WEB-INF 下时充当“虚拟软链接”的功能,并且仍然提供了所需的行为,即如果您通过浏览器对此类 URL 发出请求,则给出 404(我认为我第一次尝试时配置错误)。因此,以下内容将产生所需的行为:
<virtual-directory-mapping>
<local-path>/absolute/path/outside/of/webapp</local-path>
<url-pattern>/WEB-INF/foo/*</url-pattern>
</virtual-directory-mapping>
我在 Jetty 中也发现了类似的功能。它是通过在配置中指定多个“基础资源”来实现的。一些码头文档提供了解释和一些示例。一个功能(根据情况,我认为这既有用又有害)是结构被合并,因此您可以拥有发生冲突的路径,并且它们将按照规范的顺序解决。上面的 jetty 示例:
<Set name="baseResource">
<New class="org.mortbay.resource.ResourceCollection">
<Arg>
<Array type="java.lang.String">
<Item>/path/to/normal/webapp</Item>
<Item>/absolute/path/outside/of/webapp</Item>
</Array>
</Arg>
</New>
</Set>
这两者的一个问题是必须在外部目录中重新创建目录结构(即它必须是/absolute/path/outside/of/webapp/WEB-INF/foo)才能正常工作,据我所知,没有办法将一个目录映射到另一个任意命名的目录。