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

标签 java servlets zip httpresponse caching

我有一个返回几个 html 页面的小 servlet。其中一个页面的内容相当复杂,但大约每隔一小时就会发生变化。然而,用户经常要求这样做。我想避免在每次请求时重新计算它。

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

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

最佳答案

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

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

        }
    }
    ...
}

关于java - 如何将缓存的 gzipped html 页面返回到 http servlet 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948555/

相关文章:

java - Servlet 过滤器 - 来自 servlet 的转发请求是否会进入 servlet 过滤器?

linux - 如何将文件列表传递给 linux zip 命令

java - 直观理解

java - 我怎样才能检测到mysql的变化?

java - 无法从对象转换为 boolean 值

jsp - ${pageContext.request.contextPath} 在本地工作正常,但实时显示空白

java - 使用 Java 将 dwg 转换为 obj,无需第 3 方应用程序

Java项目构建

PHP 和 ZIP 创建 : Can standard zip "options" be applied

python - 如何准备存储在 zip 文件中的图像数据以便在 Tensorflow 2 中进行训练?