你好,你有没有在生产环境中见过扩展HttpServletResponseWrapper
/HttpServletRequestWrapper
或 ServletRequestWrapper
/ServletResponseWrapper
的实用技巧?
我曾经使用它来“捕获”JSP的输出,以便由转发控制器进行转换。这是通过重写getWriter()
/ getOutputStream()
方法实现的。
SiteMesh也做了类似的事情,捕获“目标”,以装饰响应。
request.getParameter()
等方法(Servlet <=2.5示例, Servlet >=3.0 示例)。HttpServletRequest
/HttpServletResponse
方法的默认行为。重写 getRemoteAddr()
方法,以返回由我们的 Nginx 代理设置的 X-Forwarded-For
或 X-Real-IP
值。
过滤某些头部信息,例如避免在第三方 Servlet 中进行内容协商。
对响应进行 Gzip 压缩。
<Connector compression="on">
即可:http://tomcat.apache.org/tomcat-6.0-doc/config/http.html - BalusC许多框架(至少在我的类路径上有richfaces、myfaces等)使用请求包装器来处理多部分请求。
Spring有ContextExposingHttpServletRequest
,以便Spring Bean可以作为请求属性访问。
Myfaces Orchestra使用响应包装器来重新编写URL,以确保多窗口会话上下文。
我最近使用它来捕获出站响应头以进行调试目的(在Servlet 3.0规范中,getResponseHeaderNames()和getResponseHeader()仅在响应端添加)。
我们还将其用于收集有关我们的servlet的指标,通过覆盖getOutputStream()
以返回一个 OutputStream
实现,其中每个通过的字节都增加一个计数器,以便我们可以了解网络流量高的servlet。