Spring Boot Series (семь) междоменных решений

Spring Boot
Spring Boot Series (семь) междоменных решений

Следующий контент от "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набор текста