Я переношу веб-приложение со встроенным Jetty от 7 до 9.3.2, и поэтому мне немного нужно обновить код. Само приложение имеет множество коннекторов, написанных для него, для веб-интерфейса, конечной точки API, а также для аутентификации веб-интерфейса с помощью смарт-карты. Соединительный метод для достижения этого реализуется следующим образом (для Jetty 7).Как захватить объекты сокетов во внешнюю константу в Jetty 9 (переход с Jetty 7)?
private Connector createSmartCardConnector() {
SslContextFactory sslContextFactory = createSslContextFactory(smartCardUiKeyStoreFile);
LOG.info("Using truststore file: " + trustStoreFile);
sslContextFactory.setTrustStore(trustStoreFile);
sslContextFactory.setTrustStorePassword("password");
sslContextFactory.setNeedClientAuth(true);
Connector connector = new SslSocketConnector(sslContextFactory) {
@Override public void accept(int acceptorID) throws IOException, InterruptedException {
Socket socket = _serverSocket.accept();
configure(socket);
SslConnectorEndPoint connection = new SslConnectorEndPoint(socket);
SMART_CARD_SOCKETS.add((SSLSocket) socket);
connection.dispatch();
}
};
Как видно из кода, метод SslSocketConnector.accept()
переопределяется и единственная часть, которая добавляется в SMART_CARD_SOCKETS.add((SSLSocket) socket);
. SMART_CARD_SOCKETS
- это набор, который затем используется для уничтожения добавляемых к нему объектов (сокетов). Мой вопрос здесь в том, как достичь такой же функциональности в Jetty 9, точка зрения которой заключается в том, что когда смарт-карта удаляется с компьютера пользователя, сокет будет уничтожен, когда пользователь попытается перейти дальше.
Я попытался переопределить метод ServerConnector.accept()
в Jetty 9, однако в нем используется частный метод, что делает невозможным это.
Я посмотрел на попытку создания пользовательской реализации, но я не уверен, как захватить сокет в нем. Я предполагаю, что я должен добавить его в метод customize()? Или я вообще не буду так делать? –
Да, посмотрите на метод 'customize()'. Например, приведенная выше ссылка «SecureRequestCustomizer». Тем не менее, вы захотите пересмотреть ПОЧЕМУ вам нужен Socket (его не для raw Socket, так как использование в Jetty 7 было очень опасно). Вероятно, вам понадобятся только метаданные для соединения TLS/SSL. Уже нет доступных сырых сокетов, Jetty отказался от традиционного ввода-вывода для NIO несколько лет назад. Вам нужно будет работать с каналом NIO, SSLSession или SSLEngine, чтобы получить то, что вам нужно. –
Перечитывая свой вопрос, я думаю, вам будет полезно надеть объект «EndPoint» и просто выпустить ['EndPoint.close()'] (http://download.eclipse.org/jetty/stable-9/apidocs/org /eclipse/jetty/io/EndPoint.html#close--), чтобы резко закрыть активные соединения. –