Что такое совместное использование ресурсов между источниками (CORS) — как добавить его на веб-сервер Java Jersey?
Опубликовано: 2014-07-19 Как исправить эту ошибку при взаимодействии client-server
? Сервер отправляет данные в формате JSON или XML, а клиент выдает следующее исключение.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
Обычные веб-страницы могут использовать объект XMLHttpRequest для отправки и получения данных с удаленных серверов, но они ограничены одной и той же политикой происхождения. Расширения не так ограничены. Расширение может взаимодействовать с удаленными серверами за пределами своего источника, если оно сначала запрашивает разрешения между источниками.
Кроме того, если у вас есть следующие вопросы, значит, вы находитесь в правильном месте:
- Общие сведения о совместном использовании ресурсов между источниками (фильтры CORS)
- Могу ли я использовать совместное использование ресурсов между источниками
- Как включить совместное использование ресурсов между источниками
- Что такое междоменный Ajax с общим доступом к ресурсам между источниками
- Что такое контроль доступа HTTP (CORS)
CORS (Cross Origin Resource Sharing) — это механизм, поддерживаемый W3C для включения запросов между источниками в веб-браузерах. Для работы CORS требуется поддержка как браузера, так и сервера. Это реализация фильтра веб-сервера Java Jersey для CORS на стороне сервера для веб-контейнеров, таких как Apache Tomcat и других встроенных веб-серверов.
Шаг 1:
Ответ может включать заголовок Access-Control-Allow-Origin с источником, откуда был отправлен запрос в качестве значения, чтобы разрешить доступ к содержимому ресурса. Пользовательский агент проверяет, совпадают ли значение и источник запроса.
Шаг 2:
Пользовательские агенты могут узнать с помощью предварительного запроса, готов ли ресурс кросс-источника принимать запросы, используя непростой метод, из данного источника. Это снова проверяется пользовательским агентом.
Шаг 3:
Серверные приложения могут обнаруживать, что HTTP-запрос был признан пользовательским агентом запросом между источниками через заголовок Origin. Это расширение позволяет приложениям на стороне сервера применять ограничения (например, ничего не возвращать) для запросов между источниками, которые они готовы обслуживать.
Теперь давайте начнем с примеров.
Пример 1: Веб-сервер Java Jersey
Пару недель назад я написал статью о том, как запустить встроенный HTTP-сервер во время запуска Java-приложения. В этом посте будут описаны шаги по добавлению фильтра CORS на тот же сервер Джерси.
Нам нужно расширить ContainerResponseFilter. Интерфейс реализуется фильтрами ответа контейнера. По умолчанию, т. е. если к классу реализации фильтра не применяется привязка имени, экземпляр фильтра применяется глобально к любому исходящему ответу.
Чтобы это исправить, давайте попробуем добавить следующие 4 заголовка в ответ сервера:
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- Access-Control-Max-Age
- Access-Control-Allow-Headers
Код фильтра CORS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
Модификация в файле JerseyEmbeddedHTTPServerCrunchify.java из предыдущего руководства.

Просто добавьте строку ниже в createHttpServer() и перезапустите сервер.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Результат:
http://локальный:8085/апи
Вот подробности заголовков.
Пример 2: HTTP-сервер Apache
Чтобы открыть заголовок, вы можете добавить следующую строку в разделы <Directory>, <Location> и <Files> или в файл .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Пример 3: сервер .NET может настроить это в web.config, как показано ниже.
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Пример 4: для причала (7 и выше)
Включите JAR-файл jetty-servlets в свой WEB-INF/lib и объедините его с вашим WEB-INF/web.xml.
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Пример 5: сервер Apache Tomcat (v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Пример 6: В PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Пожалуйста, дайте мне знать, если у вас есть еще вопросы по этому поводу. Список всех руководств по Java можно найти здесь.