Что такое способ калитки для загрузки пользовательских загрузок из AWS S3?Идиоматический калибровочный способ обслуживания ресурсов от Amazon S3
Требования:
- Нет прямых запросов от браузера до S3; весь трафик проксируется через наши серверы;
- Разрешить кэширование активов в браузере с использованием кэша (через контрольные суммы или поле
version
в базе данных); - Активы предоставляются только авторизованным пользователям.
я могу думать о следующих решениях:
Один SharedResource для всех ресурсов, которые разбирает URL и потоки активов:
// resource definition: mountResources("/assets/${path}", new ResourceReference("assets") { public IResource getResource() { return new AbstractResource() { public ResourceResponse newResourceResponse(RequestAttribute attributes) { String path = attributes.getParameters().get("path").toString() // request S3 and stream the content // handle caching/busting by hand } } } }) // Usage: page.add(new Image("image", new SharedResourceReference("assets"), new PageParameters().add("path", "image.jpg"))
Создать новую ResourceReference для каждого актив и передать его прямо на изображение. Подключитесь кэшами калитки путем позволяя ресурсы осуществлять IStaticCacheableResource:
class S3ResourceReference extends ResourceReference { private String path; public S3ResourceReference(String path) { ... } public IResource getResource() { return new S3Resource(path); } } class S3Resource extends AbstractResource implements IStaticCacheableResource { public S3ResourceStream getResourceStream() { S3Object object = getObject(path); return new S3ResourceStream(object); } public ResourceResponse newResourceResponse(Attributes attributes) { S3ResourceStream stream = getResourceStream(); // populate response } } class S3ResourceStream extends AbstractResourceStream { S3ResourceStream(S3Object object) { // ... } public InputStream getInputStream() { return object.objectContent } // override metadata methods } // Usage: page.add(new Image("image"), new S3ResourceReference("image.jpg"));
Какой из этих подходов выглядит более идиоматическим?
Есть ли подводные камни с использованием IStaticCacheableResource во втором фрагменте?
«В 2) запрос относится к ресурсу с областью страницы» - это та же область, что и в параметрах конструктора ResourceReference? –
No.Под этим я подразумеваю, что Wicket должен заблокировать доступ к экземпляру страницы, затем найти изображение в дереве компонентов, а затем найти ссылки на ресурсы по этому изображению. Во время этого запроса вы не сможете использовать какую-либо ссылку (Ajax) на странице. В 1) запрос относится к общему ресурсу, и вообще нет блокировки. –
Спасибо, это немного разъясняет! Таким образом, было бы нецелесообразно использовать IStaticCacheableResource для пользовательских загрузок, таких как аватары и т. Д.? –