Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于缓存的Servlet过滤器_Java_Servlets_Servlet Filters - Fatal编程技术网

Java 用于缓存的Servlet过滤器

Java 用于缓存的Servlet过滤器,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我正在为缓存创建一个servlet过滤器。其思想是将响应主体缓存到memcached。响应主体由以下内容生成(结果为字符串): 我的问题是,既然响应主体将被放入memcached而不进行修改,那么我还需要创建定制的HttpServletResponseWrapper吗?有人能提供此过滤器的框架代码吗?您需要能够在过滤器中捕获servlet的输出 为此,您需要注入一个定制的HttpServletResponseWrapper,它收集发送到getWriter().print()某处的所有输出,以便将

我正在为缓存创建一个servlet过滤器。其思想是将响应主体缓存到memcached。响应主体由以下内容生成(结果为字符串):


我的问题是,既然响应主体将被放入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;
                        }

                    };