我们来看一下在什么情况下我们需要修改HttpServletResponse
。
假设我们编写了一个Servlet,但由于业务逻辑比较复杂,处理该请求需要耗费很长的时间:
好消息是每次返回的响应内容是固定的,因此,如果我们能使用缓存将结果缓存起来,就可以大大提高Web应用程序的运行效率。
实现缓存的关键在于,调用doFilter()
时,我们不能传入原始的,因为这样就会写入Socket,我们也就无法获取下游组件写入的内容。如果我们传入的是“伪造”的HttpServletResponse
,让下游组件写入到我们预设的ByteArrayOutputStream
,我们就“截获”了下游组件写入的内容,于是,就可以把内容缓存起来,再通过原始的HttpServletResponse
实例写入到网络。
这个CachedHttpServletResponse
实现如下:
可见,如果我们想要修改响应,就可以通过构造一个“伪造”的HttpServletResponse
,这样就能拦截到写入的数据。
这个CacheFilter
同样是一个“可插拔”组件,它是否启用不影响Web应用程序的其他组件(Filter、Servlet)。
从下载练习:通过Filter修改响应 (推荐使用快速下载)
借助HttpServletResponseWrapper
,我们可以在Filter中实现对原始的修改。