伪造/设置Tomcat上下文路径

时间:2014-09-02 09:35:08

标签: tomcat mod-jk

我们使用mod_jk在负载均衡器和Apache反向代理后面的各种Tomcat实例上运行大约30个webapps。每个应用程序的公共URL都配置到Apache mod_jk配置中,该配置代理后端Tomcats。后端Tomcat在与公共URL匹配的上下文路径上运行应用程序。

e.g。

domain.com/foo/bar/webapp -- mod_jk --> tomcat/foo/bar/webapp

这是因为应用程序使用${pageContext.request.contextPath}在JSP中构建链接,例如

<script src="${pageContext.request.contextPath}/resources/js/image-manipulation.js" >     </script>

我想让这个更加松散耦合,并且&#34;容器化&#34; webapps,因此它们各自在默认上下文中运行在自己的Tomcat容器中,即/,而无需知道它们的公共URL是什么。这将简化对Tomcat配置和mod_jk映射的管理。

问题是应用程序如何在不知道它的最终公共URL是什么的情况下构建自身内部的绝对链接?有没有办法在mod_jk请求中传递URL,并让Tomcat使用此URL覆盖对${pageContext.request.contextPath}的调用?

或者最好在Apache中使用类似mod_substitute的东西来替换页面中的固定字符串,当它从Apache出来时使用URL?这似乎效率低下,因为Apache必须扫描执行此查找的所有页面。替换..

或者最好只保留原样,并将上下文路径用作当前目标?

1 个答案:

答案 0 :(得分:0)

我能想到的唯一解决方案就是:

  • 配置mod_jk以通过contextPath将所需的JkEnvVar作为变量发送(将在tomcat中作为请求参数提供)
  • 在您的网络应用中包含一个过滤器包装请求并使用该变量覆盖getContextPath()
  • 也包装你的回复以正确处理sendRedirect()和其他类似的方法(可能不那么容易)。

当然,如果tomcat可以为你做所有这些......