如何将缓存的 gzipped html 页面返回到 http servlet 请求?

Jér*_*nge 1 java zip caching servlets httpresponse

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

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

如果这是可能的,我该怎么做?我应该使用过滤器吗?对于这个问题,我们可以假设所有浏览器都可以处理 gzip 格式的响应。我正在寻找一个代码示例。

Jér*_*nge 5

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

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 ...

        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)