Подтвердить что ты не робот

Как применять кеш-память CORS для всего домена

Я создаю приложение REST, которое использует CORS. Каждый вызов REST отличается, и я нахожу, что есть значительные накладные расходы при получении вызова OPF. Есть ли способ кэшировать и применять результат OPF перед полем, чтобы любые последующие вызовы в один и тот же домен использовали кешированный ответ?

4b9b3361

Ответ 1

Предполетная печать может применяться только к запросу, а не ко всему домену. Я включил тот же вопрос в список рассылки, и были проблемы с безопасностью. Здесь весь поток: http://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html

Есть несколько вещей, которые следует учитывать, если вы хотите ограничить количество предпродажных запросов. Прежде всего обратите внимание, что браузеры, основанные на WebKit/Blink, устанавливают максимальный кеш preflight в 10 минут:

https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpp https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightResultCache.cpp

(Я не уверен, что это верно для других браузеров). Поэтому, когда вы должны всегда устанавливать заголовок Access-Control-Max-Age, максимальное значение составляет 10 минут.

Обратите внимание, что невозможно избежать предполетных запросов PUT/DELETE. Таким образом, для обновления/удаления вашего API потребуется по крайней мере один предполет каждые 10 минут.

В GET/POST избегайте настраиваемых заголовков, если это вообще возможно, поскольку они все еще запускают предвестники. Если ваш API возвращает JSON, обратите внимание, что Content-Type 'application/json' также запускает предполетную запись.

Если вы готовы сгибать как "RESTful" ваш API, есть еще несколько вещей, которые вы можете попробовать. Один из них - использовать Content-Type, который не нуждается в предполетне, например "text/plain". Пользовательские заголовки всегда вызывают предвестники, поэтому, если у вас есть пользовательские заголовки, вы можете переместить их в параметры запроса. В крайнем случае вы можете использовать протокол, такой как JSON-RPC, где все запросы отправляются в одну конечную точку.

Честно говоря, из-за пределов кэша preflight браузера в 10 минут и URL-адресов ресурсов REST, кеш предполетного контроля довольно бесполезен. Там очень мало можно сделать, чтобы ограничить префлоуты в течение долгого приложения. Я надеюсь, что авторы спецификации CORS попытаются решить эту проблему в будущем.

Ответ 2

Попробуйте использовать xDomain

Мне было довольно просто настроить, используя angular или jQuery. На сервере приложений добавьте proxy.html, как указано в справке по ссылке ниже. Добавьте несколько тегов, относящихся к файлам js на вашем "клиенте" и альте, не более предполет. Это обертывает iframe, чтобы избежать необходимости проверки кода.

https://github.com/jpillora/xdomain