我需要缓存一个网页,然后为了将来的请求,检查缓存(使用 url 作为键),如果找到,则从缓存中返回网页而不是发出请求。
我正在使用 Smiley 的 ProxyServlet,servlet 写入 OutputStream 的方法似乎非常适合缓存。我只添加了两行代码:
/**
* Copy response body data (the entity) from the proxy to the servlet client.
* TODO: CACHE entity here for retrieval in filter
*/
protected void copyResponseEntity( HttpResponse proxyResponse, HttpServletResponse servletResponse,
HttpRequest proxyRequest, HttpServletRequest servletRequest ) throws IOException
{
HttpEntity entity = proxyResponse.getEntity();
if ( entity != null )
{
String key = getCurrentUrlFromRequest( servletRequest ); // 1
basicCache.getCache().put( key, proxyResponse.getEntity() ); // 2
OutputStream servletOutputStream = servletResponse.getOutputStream();
entity.writeTo( servletOutputStream );
}
}
它有点管用,它确实将 HttpEntity 存储在缓存中。但是当我返回到浏览器并再次请求相同的 url 时,当代码返回到我的过滤器中时,我使用 url 作为键获得了 HttpEntity,并将其写入响应,但是我得到了一个“Stream closed “ 错误:
java.io.IOException: Stream closed
at java.base/java.util.zip.GZIPInputStream.ensureOpen(GZIPInputStream.java:63) ~[na:na]
at java.base/java.util.zip.GZIPInputStream.read(GZIPInputStream.java:114) ~[na:na]
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:na]
at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:64) ~[httpclient-4.5.9.jar:4.5.9]
at org.apache.http.client.entity.DecompressingEntity.writeTo(DecompressingEntity.java:93) ~[httpclient-4.5.9.jar:4.5.9]
at com.myapp.test.foo.filters.TestFilter.doFilter(TestFilter.java:37) ~[classes/:na]
我坚持使用这种非常本地化的/手动的/任何您想称之为缓存的东西——我不能使用明显的“只需连接 ehcache/redis/任何东西并让它做它的事情”。因此,虽然我知道那些优秀的缓存可以缓存整个网页,但我不知道它们是否允许我以这种公认的不寻常方式工作。
所以我希望 SO 可以告诉我如何完成这项工作。我首先尝试在 ConcurrentHashMap 中连接我的基本缓存,但这也不起作用,所以我想看看我是否可以利用大型缓存枪所拥有的任何魔力,但到目前为止我不能。
江户川乱折腾
慕桂英546537
明月笑刀无情
相关分类