❝Следующий контент от "Spring Boot + Spring Cloud + Vue + Element Combat" Глава 9: Решения по перекрестным доменам
❞
Что такое междоменный домен
В целях обеспечения безопасности данных в современных браузерах клиенты из разных источников не могут читать и записывать ресурсы другого браузера без явной авторизации.同源策略
, который является основой безопасности браузера.
ОдинURL
середина协议
,域名
,端口
одинаковые, это гомология
Возьмите адрес Baidu: http://www.baidu.com в качестве примера, определите, имеют ли следующие URL-адреса то же происхождение, что и адрес Baidu.
- http://www.baidu.com/abc.html протокол, доменное имя, порт одинаковые, принадлежат
同源
- https://www.baidu.com/ разные протоколы (https), разные источники
- http://www.baidu.com: 9090 разных портов, разные источники
- http://www.baiduABC.com/ Разные доменные имена, разные источники
- ...
судя по браузеру同源策略
, скрипты из разных источников не могут оперировать ресурсами из других источников.Если вы хотите получить ресурсы из других источников, вы столкнетесь с междоменными проблемами. Веб-сайты из разных источников отправляют друг другуAJAXЗапрос должен быть разрешен с помощью междоменного решения.
CORS
Чтобы решить проблему междоменного использования браузера, W3C предложил схему совместного использования ресурсов между доменами, а именноCORS(Совместное использование ресурсов из разных источников).
CORS может реализовать интерфейс CORS через внутренний сервер (также можно реализовать внешний интерфейс), не нарушая существующих правил, чтобы реализовать междоменное взаимодействие. CORS делит запрос на две категории:简单请求
а также非简单请求
, соответственно, для поддержки междоменной связи.
простой запрос
До появления CORS какой HTTP-запрос отправлялся при信息头
(Заголовки) не может содержать никаких настраиваемых полей, а информация HTTP не может превышать следующие поля:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type (только application/x-www/form/urlencoded, multipart.form-data, text/plain 3 типа)
Например, простой запрос, подобный следующему:
GET /test HTTP/1.1
Accept: * / *
Accept-Encoding: gzip,deflate,sdch,br
Origin: http://www.test.com
Host: www.test.com
Для простых запросов стратегия CORS заключается в добавлении в заголовок запроса поля Origin, после получения которого сервер определяет, разрешен ли доступ к запросу в соответствии с этим полем.
- Разрешите доступ, добавьте поле Access-Control-Allow-Origin в заголовок HTTP и верните правильный результат.
- Доступ запрещен, информация в заголовке"не добавлять"Access-Control-Allow-Origin
Есть также несколько полей, используемых для описания результата возврата CORS:
- Access-Control-Allow-Credentials: необязательно, может ли пользователь отправлять, обрабатывать файлы cookie
- Access-Control-Expose-Headers: необязательные поля, которые могут получить пользователи.
Следующие поля доступны пользователям независимо от того, установлены они или нет:
- Cache-Control
- Content_language
- Content-Type
- Expries
- Last-Modified
- Pargma
не простой запрос
Для непростых запросов браузер будет увеличиваться один раз, прежде чем будет сделан фактический запрос.OPTION
просьба, звоните预检请求
(предварительный запрос). Предварительный запрос добавляет реальную информацию о запросе (включая метод запроса, настраиваемые поля заголовка) в информационное поле заголовка HTTP и спрашивает сервер, разрешено ли это.
Например, следующий запрос GET
OPTIONS /test HTTP1.1
Orgin: http://www.test.com
Acess-Control-Request-Method: GET
Access-Contol-Reauest-Headers: X-Custom-Header
Host: www.test.com
Поля, связанные с CORS:
- Запрос с использованием метода HTTP: Access-Control-Request-Method
- Включить настраиваемые поля: Access-Contol-Reauest-Headers
Когда сервер получает запрос, ему необходимо проверить Origin, Access-Control-Request-Method и Access-Contol-Reauest-Headers соответственно.После прохождения проверки он будет добавлен в возвращаемый HTTP-заголовок:
- Access-Control-Allow-Origin: Http://www.test.com
- Access-Control-Request-Methods: методы GET, PUT, POST, DELETE, разрешенные для реальных запросов.
- Access-Control-Request-Headers: поля X-Custom-Header, разрешенные сервером
- Access-Control-Request-Credentials: true, разрешать ли пользователям отправлять и обрабатывать файлы cookie.
- Access-Control-Request-Max-Age: 172800 Срок действия предварительного запроса в секундах. В течение срока действия дублирующиеся предварительные запросы не будут отправлены.
Когда предварительный запрос будет передан, браузер отправит реальный запрос на сервер. Достигнут доступ к междоменным ресурсам.
Бэкэнд-реализация CORS
Серверное решение CORS реализовано следующим образом:
/**
* 跨域实现
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
public void addCorsFilter(CorsRegistry registry){
registry.addMapping("/**") // 允许跨域访问的路径
.allowedOrigins("*") // 允许跨域访问的源 *:代表所有域名都可以跨域访问
.allowedMethods("*") // 允许请求的方法 *:表示"GET","POST","PUT","DELETE"
.maxAge(168000) // 预检间隔时间
.allowedHeaders("*") // 允许头部携带任何信息
.allowCredentials(true); // 是否发送cookie true:允许携带cookie false:不允许
}
}
В этой статье используетсяmdniceнабор текста