Использование предопределенных URL-адресов в (например, Angular) SPA взрывает кеш браузера - PullRequest
0 голосов
/ 15 февраля 2019

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

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

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

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

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

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

Пока все хорошо.Большая проблема заключается в потоке загрузки.

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

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

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


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

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


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

Являются ли потоки сами по себе неправильными?

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


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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

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

0 голосов
/ 24 февраля 2019

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

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

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

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

...