Что такое совместное использование ресурсов между источниками (CORS) — как добавить его на веб-сервер Java Jersey?

Опубликовано: 2014-07-19

Учебное пособие по совместному использованию ресурсов между источниками (CORS) от Crunchify

Как исправить эту ошибку при взаимодействии client-server ? Сервер отправляет данные в формате JSON или XML, а клиент выдает следующее исключение.

Обычные веб-страницы могут использовать объект XMLHttpRequest для отправки и получения данных с удаленных серверов, но они ограничены одной и той же политикой происхождения. Расширения не так ограничены. Расширение может взаимодействовать с удаленными серверами за пределами своего источника, если оно сначала запрашивает разрешения между источниками.

Кроме того, если у вас есть следующие вопросы, значит, вы находитесь в правильном месте:

  1. Общие сведения о совместном использовании ресурсов между источниками (фильтры CORS)
  2. Могу ли я использовать совместное использование ресурсов между источниками
  3. Как включить совместное использование ресурсов между источниками
  4. Что такое междоменный Ajax с общим доступом к ресурсам между источниками
  5. Что такое контроль доступа HTTP (CORS)

CORS (Cross Origin Resource Sharing) — это механизм, поддерживаемый W3C для включения запросов между источниками в веб-браузерах. Для работы CORS требуется поддержка как браузера, так и сервера. Это реализация фильтра веб-сервера Java Jersey для CORS на стороне сервера для веб-контейнеров, таких как Apache Tomcat и других встроенных веб-серверов.

Crunchify Пример сервера CORSFilter Jersey

Шаг 1:

Ответ может включать заголовок Access-Control-Allow-Origin с источником, откуда был отправлен запрос в качестве значения, чтобы разрешить доступ к содержимому ресурса. Пользовательский агент проверяет, совпадают ли значение и источник запроса.

Шаг 2:

Пользовательские агенты могут узнать с помощью предварительного запроса, готов ли ресурс кросс-источника принимать запросы, используя непростой метод, из данного источника. Это снова проверяется пользовательским агентом.

Шаг 3:

Серверные приложения могут обнаруживать, что HTTP-запрос был признан пользовательским агентом запросом между источниками через заголовок Origin. Это расширение позволяет приложениям на стороне сервера применять ограничения (например, ничего не возвращать) для запросов между источниками, которые они готовы обслуживать.

Теперь давайте начнем с примеров.

Пример 1: Веб-сервер Java Jersey

Пару недель назад я написал статью о том, как запустить встроенный HTTP-сервер во время запуска Java-приложения. В этом посте будут описаны шаги по добавлению фильтра CORS на тот же сервер Джерси.

Нам нужно расширить ContainerResponseFilter. Интерфейс реализуется фильтрами ответа контейнера. По умолчанию, т. е. если к классу реализации фильтра не применяется привязка имени, экземпляр фильтра применяется глобально к любому исходящему ответу.

Чтобы это исправить, давайте попробуем добавить следующие 4 заголовка в ответ сервера:

  1. Access-Control-Allow-Origin
  2. Access-Control-Allow-Methods
  3. Access-Control-Max-Age
  4. Access-Control-Allow-Headers

Код фильтра CORS:

Модификация в файле JerseyEmbeddedHTTPServerCrunchify.java из предыдущего руководства.

Просто добавьте строку ниже в createHttpServer() и перезапустите сервер.

Результат:

http://локальный:8085/апи

Crunchify заголовок ответа с фильтром CORS

Вот подробности заголовков.

Заголовок ответа Crunchify без фильтра CORS

Пример 2: HTTP-сервер Apache

Чтобы открыть заголовок, вы можете добавить следующую строку в разделы <Directory>, <Location> и <Files> или в файл .htaccess .

Пример 3: сервер .NET может настроить это в web.config, как показано ниже.

Пример 4: для причала (7 и выше)

Включите JAR-файл jetty-servlets в свой WEB-INF/lib и объедините его с вашим WEB-INF/web.xml.

Пример 5: сервер Apache Tomcat (v 7.0.41 +)

Пример 6: В PHP

Пожалуйста, дайте мне знать, если у вас есть еще вопросы по этому поводу. Список всех руководств по Java можно найти здесь.