Как применить предварительный кэш CORS ко всему домену


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

3 66

3 ответа:

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

есть несколько вещей, чтобы рассмотреть, если вы хотите ограничить количество предварительных запросов. Во-первых, обратите внимание, что браузеры на основе WebKit/Blink устанавливают максимальный предполетный кэш 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, обратите внимание, что тип содержимого "application/json" также запускает предварительный полет.

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

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

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

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

https://github.com/jpillora/xdomain

один из способов заключается в том, что вы можете указать все ваши вызовы API в том же домене, что и ваш интерфейс. Настройка nginx на интерфейсном сервере для пересылки только вызовов API на сервер API. Это позволит удалить все предполетные звонки.