生产中的ServletRequestWrapper或ServletResponseWrapper?

您有没有看到在生产环境中扩展HttpServletResponseWrapper / HttpServletRequestWrapperServletRequestWrapper / ServletResponseWrapper任何有用的东西?

  • 从生成的HTML中修剪空白 ,可以节省超过50%的带宽。 我有一个项目显示大表格数据(具有很好的缩进HTML源代码),响应大小从大约200KB到大约70KB只需修剪所有空格。
  • 通过将多部分表单数据放回请求参数映射中来透明地处理multipart / form-data请求,以便您可以使用request.getParameter()并再次采用常规方式( Servlet <= 2.5示例 , Servlet> = 3.0示例 )。
  • 捕获输出流,要么拥有副本 ,要么对MD5进行哈希处理。
  • 禁用URL重写 。

Etcetera .. Etcetera ..所有只是为了覆盖和更改某些HttpServletRequest / HttpServletResponse方法的默认行为。

我用它来“捕获”JSP的输出,这样它就可以被转发控制器转换。 这是通过重写getWriter() / getOutputStream()方法完成的。

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

我们用它来

  • 覆盖getRemoteAddr()以从X-Forwarded-ForX-Real-IP返回值(由我们的nginx代理设置)

  • 过滤某些标头,例如,以避免第三方servlet中的内容协商

  • gzip响应

  • 许多框架(richfaces,myfaces至少在我当前的类路径上)使用请求包装器来处理多部分请求

  • Spring有ContextExposingHttpServletRequest因此spring bean可以作为请求属性访问。

  • myfaces orchestra使用响应包装器重写URL以确保多窗口对话上下文

我最近才使用它来捕获传出响应头以进行调试( getHeaderNames()getHeader()仅在Servlet 3.0规范的响应端添加。

我们还使用它来收集servlet上的指标,通过重写getOutputStream()来返回一个OutputStream实现,该实现在通过它的每个字节上增加一个计数器,这样我们就可以知道我们的高网络流量servlet是什么。