Введение
Полное название CORS — междоменное совместное использование ресурсов.Это механизм, основанный на обнаружении HTTP-заголовка.Управляя HTTP-заголовком, можно реализовать функцию управления правами междоменных ресурсов. В предыдущей подробной статье CORS у нас уже было базовое объяснение CORS.
В этой статье объясняется, как реализовать CORS в netty с точки зрения реализации netty.
Конфигурация CORS на стороне сервера
Друзья, знакомые с CORS, должны знать, что все операции CORS реализуются путем управления заголовками HTTP поверх протокола HTTP. Поэтому, если вы хотите реализовать поддержку CORS на стороне сервера, по сути, это тоже делается путем установки различных заголовков протокола HTTP.
Чтобы облегчить всем использование, netty предоставляет класс CorsConfig для унификации настроек заголовка CORS.
Сначала посмотрите на свойства, определенные в классе CorsConfig:
private final Set<String> origins;
private final boolean anyOrigin;
private final boolean enabled;
private final Set<String> exposeHeaders;
private final boolean allowCredentials;
private final long maxAge;
private final Set<HttpMethod> allowedRequestMethods;
private final Set<String> allowedRequestHeaders;
private final boolean allowNullOrigin;
private final Map<CharSequence, Callable<?>> preflightHeaders;
private final boolean shortCircuit;
Между этими атрибутами и настройками HTTP-заголовка CORS существует однозначное соответствие. Например, origins означает разрешенные источники, а anyOrigin означает, что разрешены все источники.
соответствует следующим параметрам:
Origin: <origin>
exposeHeaders соответствует Access-Control-Expose-Headers один к одному, указывая информацию заголовка, к которой сервер может получить доступ, позволяя клиенту получать ресурсы CORS. Его формат следующий:
Access-Control-Expose-Headers: <header-name>[, <header-name>]*
allowCredentials указывает, следует ли включить аутентификацию авторизации CORS. Указывает, принимает ли сервер запрос клиента с полем учетных данных. При использовании в предварительном запросе он указывает, поддерживает ли последующий реальный запрос учетные данные.Формат выглядит следующим образом:
Access-Control-Allow-Credentials: true
BreamwordRequestMethods представляет метод доступа доступа ресурсов, в основном используется в предварительном запросе. Его формат следующий:
Access-Control-Allow-Methods: <method>[, <method>]*
allowRequestHeaders используется в предварительном запросе для указания поля заголовка, которое действительно может быть использовано в качестве запроса. Формат следующий:
Access-Control-Allow-Headers: <header-name>[, <header-name>]*
Когда клиент отправляет метод OPTIONS на сервер, в целях безопасности, поскольку сервер может не принять эти методы OPTIONS, клиенту необходимо сначала отправить Предварительные запросы, дождитесь ответа сервера и подождите, пока сервер подтвердит, прежде чем отправлять реальный запрос. Возьмем пример. preflightHeaders представляет заголовки запросов, которые сервер разрешает для предварительной проверки.
ShortCircuit указывает, является ли запрос действительным запросом CORS. Если запрос отклонен, он возвращает значение true.
CorsConfigBuilder
CorsConfig используется для представления класса конфигурации Cors, так как же построить этот класс конфигурации? Давайте посмотрим на конструктор CorsConfig:
CorsConfig(final CorsConfigBuilder builder) {
origins = new LinkedHashSet<String>(builder.origins);
anyOrigin = builder.anyOrigin;
enabled = builder.enabled;
exposeHeaders = builder.exposeHeaders;
allowCredentials = builder.allowCredentials;
maxAge = builder.maxAge;
allowedRequestMethods = builder.requestMethods;
allowedRequestHeaders = builder.requestHeaders;
allowNullOrigin = builder.allowNullOrigin;
preflightHeaders = builder.preflightHeaders;
shortCircuit = builder.shortCircuit;
}
Вы можете видеть, что CorsConfig создается с помощью CorsConfigBuilder. Установив различные свойства в CorsConfigBuilder. CorsConfigBuilder предоставляет множество методов для установки свойств.
CorsConfig может быть создан с использованием такого метода следующим образом:
CorsConfig corsConfig = CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();
CorsHandler
С CORSCONPIG нам также необходимо настроить этот конфиг в обработчик Netty, Netty предоставляет класс CorsHandler для специально обрабатываемого CORSCONPIG, этот класс называется CorsHandler.
Сначала взгляните на конструктор CorsHandler:
public CorsHandler(final CorsConfig config) {
this(Collections.singletonList(checkNotNull(config, "config")), config.isShortCircuit());
}
public CorsHandler(final List<CorsConfig> configList, boolean isShortCircuit) {
checkNonEmpty(configList, "configList");
this.configList = configList;
this.isShortCircuit = isShortCircuit;
}
CorsHandler имеет два конструктора, один из которых передает CorsConfig, а другой передает список CorsConfig.
Основной принцип работы CorsHandler заключается в обработке responseHeader и установке заголовка CORS во время чтения канала.
поддержка netty для cors
Мы говорили об основных классах и методах cors в netty выше.Последний шаг — добавить класс поддержки cors в конвейер netty.Основной код выглядит следующим образом:
public void initChannel(SocketChannel ch) {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpResponseEncoder());
pipeline.addLast(new HttpRequestDecoder());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new ChunkedWriteHandler());
CorsConfig corsConfig = CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();
pipeline.addLast(new CorsHandler(corsConfig));
pipeline.addLast(new CustResponseHandler());
}
Суммировать
Cors относительно прост, и netty также обеспечивает достаточную поддержку методов для него. Вы можете использовать его напрямую.
Примеры этой статьи могут относиться к:learn-netty4
Эта статья была включена вWoohoo.Floyd Press.com/22-Netty-co…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!