Междоменные проблемы всегда были серьезной проблемой для фронтенда. С самого начала фронтенда и до настоящего времени я и мои коллеги вокруг меня, а также друзья в онлайн-фронтенде беспокоились об этом. проблема.
Особенно, когда я недавно написал инкапсуляцию сети, наиболее распространенной проблемой, возникающей у пользователей, является проблема междоменного доступа. Я объяснял это много раз, поэтому я напишу это здесь. Вы можете взглянуть на это и подвести итог, если хотите. забудь об этом в будущем.
Вставьте стандартный отчет о междоменных ошибках внешнего интерфейса (фон SpringBoot):
Access to XMLHttpRequest at '…' from origin '…' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
Когда дело доходит до кросс-домена, мы должны говорить о политике одного и того же происхождения браузера. Междоменность также обусловлена механизмом браузера. Существование этого механизма по-прежнему связано с безопасностью.
Происхождение веб-контента определяется схемой (протоколом), хостом (доменным именем) и портом URL-адреса, используемого для доступа к нему. Два объекта имеют одинаковое происхождение, только если схема, хост и порт совпадают.
Вы можете определить, является ли источник тем же или источником: если порт хоста схемы в URL-адресе тот же, это означает, что источник тот же.
Давайте познакомимся с этими тремя частями структуры URL.
URL означает унифицированный указатель ресурсов. URL-адрес — это не что иное, как адрес данного уникального ресурса в сети.
URL-адрес имеет следующую структуру:
Приведите пример одного и того же происхождения, но разного происхождения, чтобы облегчить
пример | причина |
---|---|
http://example.com/app1/index.html http://example.com/app2/index.html | Та же схема http и хоста |
http://Example.com:80 http://example.com | По умолчанию для http используется порт 80, поэтому он взят из того же источника. |
пример | причина |
---|---|
http://example.com/app1 https://example.com/app2 | разные протоколы |
http://example.com http://myapp.example.com | разные хосты |
http://example.com http://example.com:8080 | разные порты |
Политика одного и того же источника — это важная политика безопасности, которая ограничивает взаимодействие документов из одного источника или загруженных им скриптов с ресурсами из другого источника. Это может помочь заблокировать вредоносные документы и уменьшить возможные векторы атак.
Когда нет разделения фронтенда и бэкэнда, междоменные проблемы часто возникают редко. Потому что передняя и задняя части развернуты вместе. Теперь, когда фронтенд и бэкенд разделены, Vue/react сталкивается с проблемой междоменных запросов.
Ниже приводится изображение, цитируемое из описания официального сайта для пояснения междоменного подхода:
Механизм совместного использования ресурсов между источниками (CORS) позволяет серверам веб-приложений выполнять управление доступом между источниками, чтобы передача данных между источниками могла осуществляться безопасно. Современные браузеры поддерживают использование CORS в контейнерах API (таких как XMLHttpRequest или Fetch) для снижения риска, связанного с HTTP-запросами из разных источников.
Принцип JSONP очень прост,Просто в HTML-теге,Многие теги с атрибутами src могут запрашивать контент из разных доменов.,Например, мы знакомы сimgТеги изображений。Та же причина,Тег script также можно использовать,Вы можете использовать теги скриптов для выполнения междоменного кода JavaScript. через эти коды,Мы можем реализовать данные внешнего междоменного запроса.
jsonp может решать междоменные проблемы на стороне интерфейса, но только для запросов get. Метод реализации может ссылаться на некоторые реализации сторонних библиотек npm, также включен jquery.
Вы можете найти реализацию библиотеки jsonp в npm, это очень просто.
Большинство интерфейсных проектов, будь то проекты vue или проекты реагирования, будут работать с помощью webpack-dev-server. Webpack-dev-server может настроить прокси-сервер для решения проблемы. междоменные проблемы.
proxy: {
'/api': {
target: 'http://localhost:3000',
pathRewrite: { '^/api': '' },
changeOrigin: true,
},
}
Такие шаблоны, как vue-cli, create-react-app и umi, можно найти в папке конфигурации сервера разработки веб-пакетов и сопоставить.
Примечание. Только в среде разработки производственная среда требует того же принципа, что и веб-сервер. Как его использовать, описано ниже.
использоватьdocument.domain
Может быть изменен Домен, используемый для доступа к странице, в основном используется в домене родительско-дочерних отношений. Дочерний домен может установить document.domain равным родительскому домену, тем самым решая междоменную проблему одного и того же родительского домена.
Подниматьпример:
www.ios.xingyu.com
доступ www.web.xingyu.com
Междоменный, можно использовать document.domain
установлен на www.xingyu.com
Существует также множество серверных фреймворков, и принципы реализации схожи. Все они модифицируют соответствующие заголовки. В качестве примера возьмем широко используемые фреймворки Java SpringCloud и nodejs koa.
Междоменный подход на самом деле является проблемой, которую можно решить на уровне http. Внутреннее решение относительно простое и также является распространенным методом решения для проектов.
CORS (Cross-Origin Resource Sharing, совместное использование ресурсов между источниками) — это система, состоящая из серии передаваемых HTTP-заголовков. Эти HTTP-заголовки определяют, запрещает ли браузер интерфейсному коду JavaScript получать ответы на запросы из разных источников.
Политика безопасности того же происхождения «Междоменное» получение ресурсов по умолчанию заблокировано. но CORS Предоставьте веб-серверу такие разрешения,То есть сервер может выбирать,Разрешить запросы к ресурсам из разных источников.
Настройте междоменный заголовок в междоменном фильтре * — это подстановочный знак, разрешающий все.
@Configuration
public class GatewayCorsConfiguation {
@Bean
public CorsFilter corsFilter(){
// Инициализировать объект конфигурации cors
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowCredentials(true); // Разрешите использование файлов cookie, но при использовании файлов cookie addAllowedOrigin должен быть конкретным адресом и не может быть *
// configuration.addAllowedOrigin("*");
configuration.addAllowedOrigin("http://manage.leyou.com");
configuration.addAllowedMethod("*"); //Разрешенные методы запроса: get, put, post, delete
Configuration.addAllowedHeader("*");//Разрешенная информация заголовка
//Инициализируем конфигурацию исходного объекта cors
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**",configuration);
//3. Вернем новый CorsFilter.
return new CorsFilter(corsConfigurationSource);
}
}
koa — это механизм плагинов, и его настройка проще: просто используйте междоменные плагины.
import cors from "koa2-cors";
app.use(cors());
Я лишь немного знаю о ngnix, когда дело касается эксплуатации и обслуживания, и не буду говорить о других веб-серверах. Принцип тот же, что и у webpack-dev-server. Настройка прокси-сервера решает междоменные проблемы.
шаг:
nginx настраивает прокси для решения междоменной конфигурации:
...
location /api {
proxy_pass https://b.test.com; # настраиватьактерское Протокол и адрес сервера мастерства
}
...
На работе большинство из них по-прежнему используют бэкенд или прокси-сервер ngnix для решения проблемы. Фронтенд можно временно настроить во время разработки для решения проблемы.