Встроенный завод фильтров
Вот простая таблица со всеми фильтрующими фабриками, встроенными в Spring Cloud Gateway, которая не очень подробна, но её можно использовать как быстрый обзор. Следующим образом:
Фабрика фильтров | функция | параметр | AddRequestHeader | Добавить заголовок к исходному запросу | Название и значение заголовка | AddRequestParameter | Добавьте параметры запроса к исходному запросу | Имя и значение параметра | AddResponseHeader | Добавьте заголовок к исходному ответу | Название и значение заголовка | DedupeResponseHeader | Отклоняет дублирующиеся значения в заголовке ответа | Имя заголовка и стратегия дедупликации, которые необходимо дедупликация | Гистрикс | Введите защиту от автоматического выключателя Hystrix для маршрута | Название HystrixCommand | FallbackHeaders | Добавьте конкретную информацию об исключениях в заголовок запроса fallbackUri | Имя Хедера | PrefixPath | Добавьте префикс к исходному пути запроса | Путь префикса | PreserveHostHeader | Добавьте свойство preserveHostHeader=true в запрос, которое фильтр маршрутизации проверяет, чтобы решить, хотите ли вы отправить исходный хост | не | RequestRateLimiter | Используемый для ограничения запросов, алгоритм троттлинга является ведром токенов | keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus | Перенаправление | Перенаправьте исходный запрос на указанный URL | HTTP-код статуса и URL перенаправления | RemoveHopByHopHeadersFilter | Удалить серию заголовков, предписанных организацией IETF для первоначального запроса | Это включено по умолчанию, и вы можете указать, какие заголовки удалить через конфигурацию | RemoveRequestHeader | Удалить заголовок исходного запроса | Название заголовка | RemoveResponseHeader | Удалите заголовок исходного ответа | Название заголовка | RewritePath | Перепишите исходный путь запроса | Исходный регекс пути и регекс переписанного пути | RewriteResponseHeader | Перепишите заголовок в исходном ответе | Имя заголовка, регулярное выражение значения, переписанное значение | SaveSession | Принудительно выполнить операцию WebSession::save перед пересылкой запроса | не | secureHeaders | Добавьте серию заголовков ответов, которые служат защитой исходного ответа | Нет, вы можете изменить значения этих заголовков отклика безопасности | SetPath | Изменить исходный путь запроса | Модифицированный путь | SetResponseHeader | Измените значение заголовка в исходном ответе | Название заголовка, изменённое значение | SetStatus | Изменить статус исходного ответа | HTTP-коды статуса, которые могут быть числами или строками | Стриппрефикс | Используется для усечения пути исходного запроса | Используйте числа для обозначения количества путей, которые нужно урезать | Снова пробовать | Попробуйте повторить для разных ответов | retries、statuses、methods、series | RequestSize | Установите размер максимального количества запрошенных пакетов, которые разрешено принимать. Если размер пакета запроса превышает установленное значение, возвращается 413 Payload Too Large | Размер пакета запроса — в байтах, а значение по умолчанию — 5M | ModifyRequestBody | Измените оригинальное содержание тела запроса перед пересылкой запроса | Содержимое модифицированного тела запроса | ModifyResponseBody | Измените содержимое исходного тела ответа | Содержимое модифицированного отклика | По умолчанию | Добавьте фильтры для всех маршрутов | Название и стоимость завода фильтров |
Советы: каждая фабрика фильтров соответствует классу реализации, и вот этиНазвание класса должно заканчиваться на GatewayFilterFactoryЭто конвенция Spring Cloud Gateway, например, класс реализации, соответствующий AddRequestHeader, называется AddRequestHeaderGatewayFilterFactory. Друзья, заинтересованные в исходном коде, могут склеивать имена отдельных классов согласно этому правилу, чтобы найти код реализации этих встроенных фильтров.
1、AddRequestHeader GatewayFilter Factory
Добавьте заголовок к исходному запросу, пример конфигурации:
Добавьте заголовок запроса X-Request-Foo с значением Bar к исходному запросу
2、AddRequestParameter GatewayFilter Factory
Добавьте параметры и значения запроса к исходному запросу, пример конфигурации:
Добавьте параметр foo с значением bar к исходному запросу, то есть: foo=bar
3、AddResponseHeader GatewayFilter Factory
Добавьте заголовок к исходному ответу, пример конфигурации:
Добавьте заголовок ответа X-Request-Foo с значением Bar к исходному ответу
4、DedupeResponseHeader GatewayFilter Factory
DedupeResponseHeader может удалять дублирующиеся значения в ответных заголовках на основе настроенного имени заголовка и политики дедупликации, что является новой функцией, предоставленной Spring Cloud Greenwich SR2, и не может использоваться в этой версии.
МыЕсли заголовок CORS (Solving Cross-Domain) установлен как на шлюзе, так и на микросервисе, если конфигурация не выполнена, то значение заголовка CORS получается при запросе микросервиса -> шлюза ->, это будет так:
Вы видите, что значения этих двух заголовков дублированы, если вы хотите дедупликацию значений этих двух заголовков, вам нужно использовать DedupeResponseHeader, пример конфигурации:
Стратегия дедупликации:
- RETAIN_FIRST: По умолчанию, сохраняю первое значение
- RETAIN_LAST: Оставьте последнее значение
- RETAIN_UNIQUE: Сохранять все уникальные значения в порядке их появления
Если вы хотите получить более полное понимание фабрики фильтров, рекомендуется ознакомиться с исходным кодом фабрики фильтров, так как исходный код содержит подробные примечания и примеры, что лучше, чем официальная документация: org.springframework.cloud.gateway.filter.factory.DedupeResponseHeaderGatewayFilterFactory
5、Hystrix GatewayFilter Factory
Представляем защиту от автоматических выключателей маршрутов от Hystrix, пример конфигурации:
Hystrix — первое поколение отказоустойчивых компонентов Spring Cloud, но оно перешло в режим обслуживания, и в будущем Hystrix будет удалён Spring Cloud, заменённый Alibaba Sentinel/Resilience4J. Поэтому эта статья не будет вдаваться в подробности, если вам интересно, вы можете ознакомиться с официальной документацией: Hystrix GatewayFilter Factory
6、FallbackHeaders GatewayFilter Factory
Также поддерживая Hystrix, фабрика фильтров, описанная в предыдущем разделе, поддерживает параметр конфигурации: fallbackUri, который используется для пересылки запросов на конкретный URI при возникновении исключения. Фабрика фильтров FallbackHeaders может добавить заголовок при пересылке запроса в URI, и значение этого заголовка — это конкретная информация об исключениях. Пример конфигурации:
Я не буду вдаваться в подробности, если интересно, можете обратиться к официальной документации: FallbackHeaders GatewayFilter Factory
7、PrefixPath GatewayFilter Factory
Добавьте префиксный путь к исходному пути запроса, пример конфигурации:
Эта конфигурация делает визит на ${GATEWAY_URL}/hello переадресирован наhttps://example.org/mypath/hello
8、PreserveHostHeader GatewayFilter Factory
Добавьте свойство preserveHostHeader=true в запрос, которое фильтр маршрутизации проверяет, чтобы решить, отправлять ли исходный заголовок хоста. Пример конфигурации:
Если он не установлен, то заголовок с названием Host будет управляться Http-клиентом
9、RequestRateLimiter GatewayFilter Factory
Он используется для ограничения запросов, а алгоритм ограничения является ведром токенов. Пример конфигурации:
10、RedirectTo GatewayFilter Factory
Перенаправьте исходный запрос на указанный URL, пример конфигурации:
Эта конфигурация делает доступ к ${GATEWAY_URL}/hello перенаправленным на https://acme.org/hello , и несут одинLocation:http://acme.orgЗаголовок, тогда как HTTP-код, возвращающий клиента, — 302
Примечания:
Статус HTTP-код должен быть 3xx, например, 301
URL должен быть легитимным, который служит значением заголовка местоположения
11、RemoveHopByHopHeadersFilter GatewayFilter Factory
Для первоначального запроса на удаление серии заголовков, указанных организацией IETF, по умолчанию удалённые заголовки выглядят следующим образом:
- Связь
- Держи в живых
- Прокси-аутентификация
- Прокси-авторизация
- TE
- Прицеп
- Трансферное кодирование
- Модернизировать
Вы можете указать, какие заголовки удаляются только через конфигурацию, пример конфигурации:
12、RemoveRequestHeader GatewayFilter Factory
Чтобы убрать заголовок исходного запроса, настройте пример:
Удалите заголовок запроса X-Request-Foo из исходного запроса
13、RemoveResponseHeader GatewayFilter Factory
Чтобы убрать заголовок исходного ответа, настройте пример:
Удалите заголовок ответа с названием X-Request-Foo из исходного ответа
14、RewritePath GatewayFilter Factory
Переопределение исходного пути запроса регулярным выражением, пример конфигурации:
Эта конфигурация позволяет получить доступ к /foo/bar для переписки пути к /bar и пересылки его, то есть пересылки на https://example.org/bar。 Обратите внимание, что из-за синтаксиса YAML вместо $ нужно использовать $\
15、RewriteResponseHeader GatewayFilter Factory
Перепишите заголовок в исходном ответе, пример конфигурации:
Значимость этой конфигурации заключается в том, что если значение X-Response-Foo в заголовке ответа равно /42?user=ford&password=omg!what&flag=true, то оно будет перезаписано в /42?user=ford&password=***&flag=true согласно заданному значению, то есть password=omg!what будет перезаписан в password=***
16、SaveSession GatewayFilter Factory
Перед пересылкой запроса выполните пример конфигурации операции WebSession::save:
Он в основном используется для отложенного хранения данных (данные не сохраняются сразу), как Spring Session, и стремится обеспечить сохранение состояния сессии до пересылки запроса. Если вы интегрируете Spring Secutiry в Spring Session и хотите убедиться, что вся информация о безопасности передаётся на последующие машины, вам нужно настроить этот фильтр.
17、secureHeaders GatewayFilter Factory
Фабрика фильтров secureHeaders в основном основана на рекомендациях из этого блога, добавляя серию заголовков ответов, которые играют роль безопасности в исходном ответе. По умолчанию добавляются следующие заголовки (включая значения):
- X-Xss-Protection:1; mode=block
- Strict-Transport-Security:max-age=631138519
- X-Frame-Options:DENY
- X-Content-Type-Options:nosniff
- Referrer-Policy:no-referrer
- Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
- X-Download-Options:noopen
- X-Permitted-Cross-Domain-Policies:none
Если вы хотите изменить значения этих заголовков, вам нужно использовать соответствующие суффиксы этих заголовков следующим образом:
- xss-protection-header
- строгая транспортная безопасность
- Варианты кадров
- Content-type-options
- Политика реферера
- Контент-безопасность-политика
- Опции для скачивания
- разрешённые-междоменные политики
Пример конфигурации:
Если вы хотите отключить определённые заголовки, вы можете использовать следующую конфигурацию:
18、SetPath GatewayFilter Factory
Измените исходный путь запроса и настройте пример:
Эта конфигурация позволяет переадресовать данные на ${GATEWAY_URL}/foo/bar при доступеhttps://example.org/bar , то есть оригинальный /foo/bar был заменён на /bar
19、SetResponseHeader GatewayFilter Factory
Измените значение заголовка в исходном ответе, настройте пример:
Измените значение X-Response-Foo в исходном ответе на Bar
20、SetStatus GatewayFilter Factory
Изменить статус исходного ответа, пример конфигурации:
Значение SetStatusd может быть как числом, так и строкой. Но это должно быть значение в классе перечисления Spring HttpStatus. Обе вышеуказанные конфигурации могут возвращать HTTP-код статуса 401.
21、StripPrefix GatewayFilter Factory
Для усечения пути исходного запроса пример конфигурации:
Как показано в приведённой выше конфигурации, если запрошенный путь — /name/bar/foo, то он будет усечен до /foo и переадресирован, то есть будет усечён 2 пути.
22、Retry GatewayFilter Factory
Повторите для разных ответов, например, для HTTP-кодов статуса, пример конфигурации:
Можно настроить следующие параметры:
- повторные попытки: количество повторных попыток
- statuses: Код, который нужно перепроверить, установленный в org.springframework.http.HttpStatus
- методы: Метод запроса, который нужно повторить, со значением org.springframework.http.HttpMethod
- последовательность статусного кода series:HTTP, со значением org.springframework.http.HttpStatus.Series
23、RequestSize GatewayFilter Factory
Установите размер максимального количества разрешенных для получения пакетов запросов, пример конфигурации:
Если размер пакета запроса превышает установленное значение, возвращается 413 Payload Too Large вместе с сообщением об ошибке
24、Modify Request Body GatewayFilter Factory
Измените оригинальное содержимое тела запроса перед пересылкой, фабрика фильтров может быть настроена только по коду, а не в конфигурационном файле. Пример кода:
Советы: эта фабрика фильтров находится в состоянии BETA, и API может измениться в будущем.Пожалуйста, используйте производственную среду с осторожностью
25、Модификация откликательного тела GatewayFilter Factory
Фабрика фильтров также может использоваться для изменения содержимого исходного тела ответа, и фабрика фильтров может быть настроена только по коду, а не в конфигурационном файле. Пример кода:
Советы: эта фабрика фильтров находится в состоянии BETA, API может измениться в будущем, пожалуйста, используйте его с осторожностью в производственной среде
26、Default Filters
Default Filters используется для добавления фабрики фильтров ко всем маршрутам, то есть для передачиЗавод фильтров, настроенный фильтром по умолчанию, будет применяться ко всем маршрутам。 Пример конфигурации:
(Конец)
|