2 回答
TA贡献1851条经验 获得超5个赞
课堂上TestFilter
,能不能在这一行下个断点调试一下?
HttpEntity page = (HttpEntity) basicCache.getCache().get( url );
底层流可能不处于您实际执行的状态:
page.writeTo( servletOutputStream );
本质上,声明PrintWriter
您控制状态,从缓存中获取内容,写入响应,然后关闭编写器。
TA贡献1848条经验 获得超10个赞
正如这里已经说过的, 应该在 HttpServletResponse.getOutputStream()/.getWriter() 上调用 .close() 吗?
您最好为您的 servlet 实现一个包装器,详见下文。
https://www.oracle.com/technetwork/java/filters-137243.html#72674
TA贡献1828条经验 获得超4个赞
我想知道为什么所有这些很好的答案都同意包装 HttpServletResponse 而我无法让它工作——我觉得自己像个白痴。它没有用,因为对 wrap 的响应中没有任何内容。
页面内容从一开始就全部在 HttpEntity 中: HttpEntity entity = proxyResponse.getEntity();
在我意识到追逐 servlet 响应/请求不是答案之后,我很幸运地发现:org.apache.http.entity.BufferedHttpEntity
包装一个 HttpEntity 以便您可以重复获取内容),但是它是在正确的对象上进行的。
所以上面的第一个方法只是稍微调整了一下,它仍然代理得很好:
if ( entity != null )
{
String key = getCurrentUrlFromRequest( servletRequest );
OutputStream servletOutputStream = servletResponse.getOutputStream();
BufferedHttpEntity wrapper = new BufferedHttpEntity( entity );
basicCache.getCache().put( key, wrapper );
wrapper.writeTo( servletOutputStream );
}
将 BasicCache 更改为期望一个 String 和一个 BufferedHttpEntity,然后对于后续请求,在过滤器中从缓存中获取 BufferedHttpEntity,完成所有工作的行与上面的最后一行相同:
if ( null != page )
{
OutputStream servletOutputStream = servletResponse.getOutputStream();
page.writeTo( servletOutputStream ); // bingo
}
else
{
filterChain.doFilter( servletRequest, servletResponse );
}
感谢大家的帮助!
添加回答
举报