【问题标题】:Servlet filter for caching用于缓存的 Servlet 过滤器
【发布时间】:2011-04-26 01:13:34
【问题描述】:

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

 response.getWriter().print(result);

我的问题是,既然响应体会直接放入memcached而不做修改,那我还需要创建一个自定义的HttpServletResponseWrapper吗?谁能提供这个过滤器的任何骨架代码?

【问题讨论】:

    标签: java servlets servlet-filters


    【解决方案1】:

    您需要能够在过滤器中捕获 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.getBytes()。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多