日期:2014-05-16  浏览次数:21284 次

Apache2.2.4 + Tomcat5.0整合手记
基于反向代理的动态页面缓存技术(参见车东文章),
落实到穷人的解决方案之一就是Apache+tomcat的整合,整合应当达到以下几方面效果:
1.Apache负责静态文件的处理
2.涉及jsp,servlet的动态请求交给tomcat处理
3.通过自定义错误响应404,当Apache找不到静态页面时,应当重定向给tomcat处理
4.在负责处理第3种情况tomcat的servlet或者jsp中,能够获得重定向之前的URL等信息。

看了网上的文章,需要在apache2.2自带ajp或者mod_jk之间做出选择。
先试试ajp吧,大家都说配置简单。
搜了一下,以这篇文章讲得最为清楚。
按照作者指引,很快来到了第4步。在httpd-vhosts.conf中加入一行
??? ErrorDocument 404 /rp/test.jsp
其中test.jsp是统一的404错误入口,将来调用模板和数据生成请求的静态页面。
测试代码如下:
<%@ page contentType="text/html;charset=gb2312" import="java.util.*"%>
<%out.println("

Hello World!jsp

");%>
<%
Object redir_url = request.getAttribute("REDIRECT_URL");
out.println(redir_url);
%>

结果404错误重定向到该页面后,确无法获得原始的URL。
在网上搜索,也有难友遇到同样的问题,即ajp没有提供类似mod_jk的JkEnvVar机制,
以将错误重定向的环境变量传递给servlet的request.getAttribute
关于apache的自定义错误处理参见www.kingmx.com/Manual/ApacheMenu/custom-error.html
没奈何只好悻悻作罢。
后来想了想,有一个曲折的解决办法就是,将ErrorDocument重定向到apache下的一个html,再由此html在browser端
利用js调用tomcat的servlet并将原始URL传递进去。
关键代码行如下:

document.location="http://localhost/batcal/test.jsp?ru="+document.URL;
这个办法的缺点是效率较低,与服务端重定向相比较,多了一次http交互.

改用mod_jk好了
根据以下链接http://blog.sina.com.cn/u/4c592ecf010009dz
指引,同样顺利来到第4步。

在httpd.conf中加入一行
JkEnvVar REDIRECT_URL NULL
再次调用test.jsp,结果通过request.getAttribute("REDIRECT_URL");获得了原始URL,搞定。

与采用ajp相比,mod_jk的配置确实麻烦。但总算实现了预期目标。