2011-04-26 43 views
3

我正在为高速缓存创建一个servlet过滤器。这个想法是将响应主体缓存到memcached。由生成的响应体(结果是一个字符串):用于高速缓存的Servlet过滤器

response.getWriter().print(result); 

我的问题是,由于响应体将投入memcached的不加修饰,我还需要创建一个自定义HttpServletResponseWrapper?任何人都可以提供此过滤器的任何骨架代码?

回答

2

您需要能够捕获过滤器中的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容器前使用一个单独的代理服务器。您可以控制通常缓存控制标头应该缓存的内容(如果servlet尚未执行,可以使用筛选器设置它)。

+0

谢谢,这是否意味着即使响应主体不会被修改,HttpServletResponseWrapper也是必须的? – dolphincody 2011-04-26 01:34:44

+0

你还将如何去servlet的输出?如果你什么都不做,它会直接写入浏览器的网络连接,而你的过滤器不会看到任何内容。 – Thilo 2011-04-26 01:36:56

+0

谢谢,现在我该如何从包装器中获取响应体呢? – dolphincody 2011-04-26 02:04:23