PushBuilder, которого больше нет

19.03.2026 · Servlet 4.0+, HTTP/2

Когда в Servlet 4.0 появился PushBuilder, казалось, что это одна из главных причин переходить на HTTP/2: сервер сам отправляет браузеру стили и скрипты, не дожидаясь, пока тот разберёт HTML. Сейчас этот код почти везде работает вхолостую.

Что случилось с Server Push

Chrome отключил HTTP/2 Server Push по умолчанию в 2022 году, начиная с версии 106. Firefox убрал поддержку позже. На практике push редко давал выигрыш: сервер не знает, что уже лежит в кэше браузера, и часто отправлял ресурсы, которые были не нужны, занимая канал в самый важный момент загрузки страницы.

Для серверного кода это не ошибка: request.newPushBuilder() по-прежнему существует, а если клиент push не поддерживает, метод просто возвращает null. Именно поэтому такой код годами живёт в проектах незамеченным.

Что делать с существующим кодом

Чем заменить

Самый простой вариант — заголовок Link с rel=preload. Решение о загрузке остаётся за браузером, который знает про свой кэш:

response.addHeader("Link",
    "</css/app.css>; rel=preload; as=style");

Следующий шаг — ответ 103 Early Hints: сервер отправляет те же заголовки Link ещё до того, как готов основной ответ, и браузер начинает загрузку, пока приложение ходит в базу. Его поддерживают Chrome и многие CDN, причём CDN часто умеют формировать Early Hints сами по заголовкам Link из предыдущих ответов — тогда приложению ничего менять не нужно.

Итог

HTTP/2 остаётся полезным — мультиплексирование и сжатие заголовков никуда не делись. Ушла только идея, что сервер лучше браузера знает, что тому нужно загрузить.