Я пишу серверное приложение и его клиентский аналог, которые оба используют Netty для сетевого уровня. Я сталкиваюсь с типичными проблемами безопасности при отправке пароля с клиента на сервер, поэтому я решил, что SSL — самый безопасный способ сделать это.
Я знаю о securechat и буду использовать его для соответствующей модификации моих пайплайнов. Однако я также хотел бы отключить SSL после передачи пароля и подтвердить, чтобы сэкономить несколько драгоценных циклов процессора на стороне сервера, который может быть занят многими другими клиентами. В документации ChannelPipeline указано следующее:
«После присоединения соединение между каналом и конвейером является постоянным; канал не может ни присоединить к нему другой трубопровод, ни отсоединить от него текущий трубопровод».
Идея состоит в том, чтобы не менять конвейер на лету, что запрещено, а каким-то образом сообщить SslHandler в конвейере, что в какой-то момент он должен прекратить шифрование сообщений. Я думал о создании класса, наследуемого от SslHandler, переопределяющего его функцию handleDownstream для вызова context.sendDownstream(evt) после некоторого момента связи. .
Вопрос 1. Является ли это плохой идеей, то есть отключением SSL в какой-то момент?
Чтобы позволить блоку в конвейере (скажем, Decoder) сообщать другому блоку (скажем, SslHandler), что с этого момента он должен изменить свое поведение, я подумал, что могу создать, скажем, , AtomicBoolean в моей ChannelPipelineFactory getPipeline() и передать его конструктору как Decoder, так и SslHandler.
Вопрос 2. Является ли это плохой идеей, то есть разделением состояния между блоками конвейера? Я беспокоюсь, что могу испортить многопоточность Netty здесь: блоки конвейера работают с одним сообщением, по одному за раз? то есть: первый блок ждет завершения последнего блока, прежде чем вытащить следующее сообщение?
ИЗМЕНИТЬ:
Боже мой, это из ChannelPipeline страница, которую я посещал много раз и цитировал в этом же вопросе:
«ChannelHandler может быть добавлен или удален в любое время, потому что ChannelPipeline является потокобезопасным. Например, вы можете вставить SslHandler перед обменом конфиденциальной информацией и удалить его после обмена».
Таким образом, это отвечает на вопрос 2 об изменении content конвейера на лету, а не самой ссылки на конвейер.