Monthly Archives: January 2015

配置Tomcat打印http request内容的详细信息

最近有客户说升级了我们的产品他们SSO环境突然不工作了,他们不确定是第三方的authentication center出了问题还是我们产品的问题,事实上绝大多数的SSO实现都依赖于http header,我们的产品依赖于REMOTE_USER这个header来告诉我们已经通过授权的用户名,这里要多说一句,http header REMOTE_USER和HttpServletRequest.getRemoteUser可不一样,这个方法拿的是一个类似cgi运行环境的环境变量,例如如果IIS+Tomcat来实现windows authentication的时候,ajp3协议里会会告诉这个环境变量的值,这个时候跟http request就没什么关系了。

客户要求我们是否能够帮助dump出到达tomcat容器的http requests,来证明确实要求的http request不包含相应的内容,想了一下,这应该是容器提供的debug功能,所以查了查文档,果然tomcat的valve架构就是完成类似事情的,而且有一个专门的valve来做这件事

<Valve className="org.apache.catalina.valves.RequestDumperValve"/>

只要在server.xml里uncomment这一行就好了。

不过这个valve不适用tomcat 7,tomcat团队在tomcat 7里面决定把类似的功能放入标准的Java Servlet Filter体系,并且内置了filter类,org.apache.catalina.filters.RequestDumperFilter,使用也很简单,只要在web.xml里按照下面的样子配置就好

<filter>
    <filter-name>requestdumper</filter-name>
    <filter-class>
        org.apache.catalina.filters.RequestDumperFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>requestdumper</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

不过可惜的是两者的功能有那么一点点的不等价,甚至tomcat 6的valve更胜一筹,有些debug scenarios里filter表现出有点奇怪的方式,具体可以看这里