如何将套接字对象捕获到 Jetty 9 中的外部常量(从 Jetty 7 迁移)?
How to capture socket objects into external constant in Jetty 9 (migrating from Jetty 7)?
我正在将带有嵌入式 Jetty 的 Web 应用程序从 7 迁移到 9.3.2,因此我需要稍微更新一下代码。该应用程序本身有许多为其编写的连接器,用于 Web UI、API 端点以及通过智能卡对 Web 界面进行身份验证。实现它的连接器方法实现如下(对于 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 中实现相同的功能,重点是当智能卡从用户的计算机中移除时,当用户尝试进一步导航时套接字将被破坏。
我试图覆盖 Jetty 9 中的 ServerConnector.accept()
方法,但是它使用了私有方法,这使得这不可能。
您想要的是 HttpConfiguration.Customizer
.
的自定义实现
将它添加到您感兴趣的 ServerConnector
的 HttpConfiguration
,然后它会 运行 每次接受。
的使用示例
// 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);
我正在将带有嵌入式 Jetty 的 Web 应用程序从 7 迁移到 9.3.2,因此我需要稍微更新一下代码。该应用程序本身有许多为其编写的连接器,用于 Web UI、API 端点以及通过智能卡对 Web 界面进行身份验证。实现它的连接器方法实现如下(对于 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 中实现相同的功能,重点是当智能卡从用户的计算机中移除时,当用户尝试进一步导航时套接字将被破坏。
我试图覆盖 Jetty 9 中的 ServerConnector.accept()
方法,但是它使用了私有方法,这使得这不可能。
您想要的是 HttpConfiguration.Customizer
.
将它添加到您感兴趣的 ServerConnector
的 HttpConfiguration
,然后它会 运行 每次接受。
// 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);