Как вернуть кэшированные hzml-страницы в формате http в запрос http - PullRequest
0 голосов
/ 31 октября 2011

У меня есть маленький сервлет, возвращающий несколько html-страниц.Содержание одной из этих страниц довольно сложное, но меняется только каждый час или около того.Однако, это часто запрашивается пользователями.Я хочу избежать повторного вычисления при каждом запросе.

Мне было интересно, можно ли подготовить версию gzip в памяти (байтовый массив) и установить ее как ответ на все запросы HTML для этой страницы,Я также буду пересчитывать новую кэшированную версию gzip-ed каждый час.

Если это возможно, как я могу это сделать?Должен ли я использовать фильтр?Ради этого вопроса мы можем предположить, что все браузеры могут обрабатывать gzip-ed ответы.Я ищу пример кода.

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

После некоторого поиска в Google, кажется, это решение:

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

        }
    }
    ...
}
2 голосов
/ 01 ноября 2011

Зачем делать это нелегко?

Откройте Tomcat /conf/server.xml, найдите <Connector> для своего порта HTTP и отредактируйте его следующим образом, чтобы добавить новый атрибут:

<Connector ... compression="on">

Tomcat будет автоматически GZIP все ответы, соответствующие compressableMimeType, когда клиент его поддерживает. Все другие уважаемые веб-серверы имеют аналогичные настройки.

0 голосов
/ 31 октября 2011

Это не совсем понятно из вашего вопроса, но я предполагаю, что вы ищете информацию о том, как кэшировать данные, а не как обслуживать сжатые данные. Большинство веб-серверов автоматически сжимают данные, если настроены на это, и если клиент предоставляет необходимые заголовки в запросе. Другими словами, вам не нужно сжимать страницу перед ее передачей, сервер будет сжимать ее автоматически, если это возможно.

Для кэширования вы можете сохранить обработанную версию страницы либо на диске, либо в памяти, используя, например, memcache.

Если вы знаете, что вам нужно всего лишь обновлять страницу, скажем, каждый час, вы можете запустить скрипт, например, с помощью crontab, чтобы генерировать страницу каждый час и просто обслуживать сгенерированную страницу. Это должно быть довольно просто, так как вам не нужно особо учитывать особенности кэширования на стороне сервера.

С другой стороны, если вам нужно проверить, устарела ли страница, прежде чем принимать решение о том, использовать ли кэшированную или свежую версию, она становится немного более сложной. Например, возможно, что проверка устаревших данных почти так же затратна, как и генерация страницы.

Не могу дать более конкретный ответ без подробностей.

...