Java 用于缓存的Servlet过滤器
我正在为缓存创建一个servlet过滤器。其思想是将响应主体缓存到memcached。响应主体由以下内容生成(结果为字符串):Java 用于缓存的Servlet过滤器,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我正在为缓存创建一个servlet过滤器。其思想是将响应主体缓存到memcached。响应主体由以下内容生成(结果为字符串): 我的问题是,既然响应主体将被放入memcached而不进行修改,那么我还需要创建定制的HttpServletResponseWrapper吗?有人能提供此过滤器的框架代码吗?您需要能够在过滤器中捕获servlet的输出 为此,您需要注入一个定制的HttpServletResponseWrapper,它收集发送到getWriter().print()某处的所有输出,以便将
我的问题是,既然响应主体将被放入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容器前面使用一个单独的代理服务器。您可以控制通常的缓存控制头(如果servlet还没有这样做,您可以使用过滤器设置)应该缓存的内容。谢谢,这是否意味着即使不修改响应主体,HttpServletResponseWrapper也是必须的?您还将如何获得servlet的输出?如果您不执行任何操作,它将直接写入到浏览器的网络连接,而您的筛选器将看不到任何内容。谢谢,现在我如何从包装器中取出响应正文?它将响应放入ByteArrayOutputStream baos,以便您可以调用baos.getBytes()。
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;
}
};