如何将缓存的gzip压缩页面返回到http servlet请求?

时间:2011-10-30 23:05:59

标签: java servlets zip httpresponse caching

我有一个小的servlet返回几个html页面。其中一个页面的内容非常复杂,但每隔一小时左右就会发生变化。但是,用户经常要求它。我想避免在每次请求时重新计算它。

我想知道是否可以在内存中准备一个gzip-ed版本(字节数组),并将其设置为对此页面的所有HTML请求的响应。我还会每小时重新计算一个新的缓存gzip-ed版本。

如果可以,我该怎么做?我应该使用过滤器吗?为了这个问题,我们可以假设所有浏览器都可以处理gzip-ed响应。我正在寻找代码示例。

3 个答案:

答案 0 :(得分:3)

经过一番谷歌搜索,这似乎是解决方案:

public class MyFilter implements Filter {

    private byte[] my_gzipped_page = ....

    public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {

        if (req instanceof HttpServletRequest) {

            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;

            String ae = request.getHeader("accept-encoding");

            if (ae != null && ae.indexOf("gzip") != -1) {

                response.addHeader("Content-Length",
                    Integer.toString(my_gzipped_page.length)); 
                response.addHeader("Content-Encoding", "gzip");

                OutputStream output = response.getOutputStream();
                output.write(my_gzipped_page);
                output.flush();
                output.close();

                return;

            } else ...

        }
    }
    ...
}

答案 1 :(得分:2)

为什么要这么做呢?

打开Tomcat的/conf/server.xml,查找HTTP端口的<Connector>并按如下方式编辑它以添加新属性:

<Connector ... compression="on">

当客户端支持时,Tomcat将自动GZIP所有与compressableMimeType匹配的响应。所有其他自尊的Web服务器都有类似的配置设置。

答案 2 :(得分:0)

你的问题并不是很清楚,但我猜你正在寻找有关如何缓存数据的信息,而不是如何提供压缩数据。如果配置为这样做,大多数Web服务器将自动压缩数据,并且如果客户端在请求中提供必要的头。换句话说,您无需在传输页面之前压缩页面,服务器将尽可能自动压缩页面。

对于缓存,您可以使用例如memcache将已处理的页面版本存储在磁盘或内存中。

如果你知道你只需要每小时更新一次页面,你就可以运行一个脚本,例如使用crontab,每小时生成一个页面,然后只提供生成的页面。这应该是相当直接的,因为就服务器端的缓存而言,你真的不需要特别考虑。

另一方面,如果您在决定使用缓存版本或新版本之前需要检查页面是否陈旧,则会更复杂一些。例如,检查数据是否过时可能与生成页面一样昂贵。

如果没有更多详细信息,无法提供更具体的答案。