在生产环境中使用ServletRequestWrapper或ServletResponseWrapper?

3

你好,你有没有在生产环境中见过扩展HttpServletResponseWrapper/HttpServletRequestWrapperServletRequestWrapper/ServletResponseWrapper的实用技巧?


2
这应该是社区维基百科。 - skaffman
5个回答

3

我曾经使用它来“捕获”JSP的输出,以便由转发控制器进行转换。这是通过重写getWriter() / getOutputStream()方法实现的。

SiteMesh也做了类似的事情,捕获“目标”,以装饰响应。


3
  • 从生成的HTML中去除空格,可以节省超过50%的带宽。我曾经有个项目显示大量的表格数据(具有良好缩进的HTML源代码),通过仅削减所有空白,响应大小从~200KB降至~70KB。
  • 通过将多部分/表单数据放回请求参数映射来透明地处理多部分/表单数据请求,使您可以再次以通常的方式使用request.getParameter()等方法(Servlet <=2.5示例, Servlet >=3.0 示例)。
  • 捕获输出流,可以用于副本MD5哈希
  • 禁用URL重写
Etcetera.. Etcetera.. 这些都是为了覆盖和更改某些HttpServletRequest/HttpServletResponse方法的默认行为。

2
我们使用它来:
  • 重写 getRemoteAddr() 方法,以返回由我们的 Nginx 代理设置的 X-Forwarded-ForX-Real-IP 值。

  • 过滤某些头部信息,例如避免在第三方 Servlet 中进行内容协商。

  • 对响应进行 Gzip 压缩。


GZIP在任何好的servlet容器中都是可配置的。例如,在Tomcat中,只需设置<Connector compression="on">即可:http://tomcat.apache.org/tomcat-6.0-doc/config/http.html - BalusC
@balusc 我们一直在使用嵌入式Jetty。请参阅http://docs.codehaus.org/display/JETTY/GZIP+Compression和http://jetty.codehaus.org/jetty/jetty-6/xref/org/mortbay/servlet/GzipFilter.html。 - sfussenegger

2
  • 许多框架(至少在我的类路径上有richfaces、myfaces等)使用请求包装器来处理多部分请求。

  • Spring有ContextExposingHttpServletRequest,以便Spring Bean可以作为请求属性访问。

  • Myfaces Orchestra使用响应包装器来重新编写URL,以确保多窗口会话上下文。


2

我最近使用它来捕获出站响应头以进行调试目的(在Servlet 3.0规范中,getResponseHeaderNames()和getResponseHeader()仅在响应端添加)。

我们还将其用于收集有关我们的servlet的指标,通过覆盖getOutputStream()以返回一个 OutputStream 实现,其中每个通过的字节都增加一个计数器,以便我们可以了解网络流量高的servlet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接