Использование предопределенных URL-адресов в (например, Angular) SPA взрывает кеш браузера

В нашем проекте мы решили использовать предопределенные URL в качестве базового механизма аутентификации.

Урезанная наша установка включает в себя

  • сервер хранения
  • сервер API
  • клиент (угловой SPA работает в браузере)

Мы используем заранее определенные URL-адреса для загрузки и выгрузки файлов с клиента непосредственно на сервер хранения.

Загрузка потока (упрощенно):

  • клиент отправляет API: эй, я хочу загрузить это
  • API выполняет авторизацию и проверку, выполняет некоторые операции с базой данных и возвращает заданный URL
  • клиент загружает прямо на сервер хранения

Все идет нормально. Большая проблема - поток загрузки.

  • клиент спрашивает API: эй, покажи мне список того, что у вас есть
  • API выполняет авторизацию, проверку и возвращает список объектов json, который также содержит предварительно заданные URL-адреса get для отображения файлов (изображений)
  • клиент отображает список данных объекта и встраивает изображения, загруженные непосредственно с сервера хранения, с использованием предварительно заданных URL-адресов

Это прекрасно работает, но увеличивает кэш браузера до нескольких ГБ ОЗУ.

Это происходит потому, что предварительно назначенные URL-адреса, сгенерированные при многократных вызовах, не одинаковы и различаются в части авторизации (например, при сохранении нового свежего времени жизни) для каждого запроса. Когда пользователь нажимает вперед и назад по разбитому на страницы списку, клиент получает разные URL-адреса, а кеш браузера обрабатывает их как разные изображения.


Пока что это похоже на правильное поведение на стороне браузера (разные URL равны разным изображениям).

Пока что это похоже на правильное поведение на стороне API (новый вызов вернет новое время жизни).


Есть какие-то предполагаемые способы, как справиться с этим?

Сами потоки не правы?

Любые способы решить эту проблему, кроме реализации централизованного предварительно назначенного URL-кэша при запуске нескольких экземпляров API?


Пусть кто-нибудь также может дать совет для значимых тегов, которые я мог бы использовать

2 ответа

Другое решение заключается в использовании presignedurl API от minio-js https://docs.minio.io/docs/javascript-client-api-reference.html

Пожалуйста, смотрите https://github.com/minio/minio-js/issues/724 и https://github.com/minio/minio-js/pull/728 для получения дополнительной информации.

Каждый запрос на предварительно подписанный ресурс в вашем текущем потоке заставляет браузер / клиент делать новый запрос на S3.

Следовательно, преимущество кэша браузера не используется и может быть достигнуто без указания дополнительных заголовков ответов для управления политикой кэширования в клиенте при создании предварительно назначенных URL-адресов. Cache-Control заголовок ответа может быть установлен в заголовках ответа для предварительно подписанного запроса no-cache, 1

Лучший способ, который я предлагаю, - это чтобы у предварительно подписанных URL-адресов был срок действия между 5 в 15 мин и установить Cache-Control в заголовках ответа ответа предварительно подписанного URL-адреса max-age:<expire-time-in-secs>,

В этом новом потоке вам нужно будет убедиться, что сервер API возвращает только новый список предварительно подписанных URL-адресов после истечения срока действия, сохраняя также кэш на стороне сервера. Вы могли бы выиграть от времени отклика от сервера API, а также избежать обслуживания ненужных запросов от браузера для кэшированного ресурса.

Другие вопросы по тегам