我正在创建一个用于缓存的 servlet 过滤器。这个想法是将响应主体缓存到memcached。响应正文由(结果是字符串)生成:
response.getWriter().print(result);
我的问题是,由于响应正文将不加修改地放入memcached,我是否还需要创建自定义的HttpServletResponseWrapper?谁能提供这个过滤器的框架代码?
您需要能够在过滤器中捕获 servlet 的输出。
为此,您需要注入一个自定义的
HttpServletResponseWrapper
来收集发送到 getWriter().print()
某处的所有输出,以便您可以将其交给 memcached。
也许是这样的:
ByteArrayOutputStream baos = new ByteArrayOutputStream(3000);
final PrintWriter w = new PrintWriter(new OutputStreamWriter(baos, "UTF-8"));
HttpServletResponse wrapper = new HttpServletResponseWrapper(response) {
@Override
public PrintWriter getWriter() throws IOException {
return w;
}
};
如果这是一个更大的项目,并且您对网络基础设施有更多的控制权,那么最好不要在 Java 中执行此操作,而是在 Servlet 容器前面使用单独的 代理服务器 。您可以通过常用的
Cache-Control
HTTP 标头来控制应缓存的内容(如果 servlet 尚未执行此操作,则可以使用过滤器进行设置)。