2015-08-27 1 views
0

Я переношу веб-приложение со встроенным 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, однако в нем используется частный метод, что делает невозможным это.

ответ

0

Что вы хотите, это специальная реализация HttpConfiguration.Customizer.

Добавьте его в свой HttpConfiguration для интересующего вас ServerConnector, а затем он будет работать с каждым примите.

Пример использования SecureRequestCustomizer.java.

// Setup SSL 
    SslContextFactory sslContextFactory = new SslContextFactory(); 
    sslContextFactory.setKeyStorePath("/path/to/keystore"); 
    sslContextFactory.setKeyStorePassword("password"); 
    sslContextFactory.setKeyManagerPassword("password"); 

    // Setup HTTPS Configuration 
    HttpConfiguration httpsConf = new HttpConfiguration(); 
    httpsConf.setSecurePort(8443); 
    httpsConf.setSecureScheme("https"); 
    httpsConf.addCustomizer(new SecureRequestCustomizer()); // adds ssl info to request 

    // Establish the ServerConnector 
    ServerConnector httpsConnector = new ServerConnector(server, 
      new SslConnectionFactory(sslContextFactory,"http/1.1"), 
      new HttpConnectionFactory(httpsConf)); 
    httpsConnector.setPort(httpsPort); 

    server.addConnector(httpsConnector); 
+0

Я посмотрел на попытку создания пользовательской реализации, но я не уверен, как захватить сокет в нем. Я предполагаю, что я должен добавить его в метод customize()? Или я вообще не буду так делать? –

+0

Да, посмотрите на метод 'customize()'. Например, приведенная выше ссылка «SecureRequestCustomizer». Тем не менее, вы захотите пересмотреть ПОЧЕМУ вам нужен Socket (его не для raw Socket, так как использование в Jetty 7 было очень опасно). Вероятно, вам понадобятся только метаданные для соединения TLS/SSL. Уже нет доступных сырых сокетов, Jetty отказался от традиционного ввода-вывода для NIO несколько лет назад. Вам нужно будет работать с каналом NIO, SSLSession или SSLEngine, чтобы получить то, что вам нужно. –

+0

Перечитывая свой вопрос, я думаю, вам будет полезно надеть объект «EndPoint» и просто выпустить ['EndPoint.close()'] (http://download.eclipse.org/jetty/stable-9/apidocs/org /eclipse/jetty/io/EndPoint.html#close--), чтобы резко закрыть активные соединения. –

Смежные вопросы