高階技術
本節介紹了一些在特定情況下可能會有用的高階技術。
策略介面
在許多情況下,前面描述的配置足以在 TCP/IP 上啟用安全通訊。但是,Spring Integration 提供了許多策略介面,允許自定義和修改套接字工廠和套接字。
-
TcpSSLContextSupport -
TcpSocketFactorySupport -
TcpSocketSupport -
TcpNetConnectionSupport -
TcpNioConnectionSupport
TcpSSLContextSupport 策略介面
以下清單顯示了 TcpSSLContextSupport 策略介面
public interface TcpSSLContextSupport {
SSLContext getSSLContext() throws Exception;
}
TcpSSLContextSupport 介面的實現負責建立 SSLContext 物件。框架提供的實現是 DefaultTcpSSLContextSupport,前面已介紹。如果您需要不同的行為,請實現此介面並向連線工廠提供您類實現的 bean 引用。
TcpSocketFactorySupport 策略介面
以下清單顯示了 TcpSocketFactorySupport 策略介面的定義
public interface TcpSocketFactorySupport {
ServerSocketFactory getServerSocketFactory();
SocketFactory getSocketFactory();
}
此介面的實現負責獲取 ServerSocketFactory 和 SocketFactory 的引用。提供了兩種實現。第一種是用於非 SSL 套接字(未定義 ssl-context-support 屬性時)的 DefaultTcpNetSocketFactorySupport。它使用 JDK 的預設工廠。第二種實現是 DefaultTcpNetSSLSocketFactorySupport。預設情況下,當定義了 ssl-context-support 屬性時,會使用它。它使用該 bean 建立的 SSLContext 來建立套接字工廠。
此介面僅在 using-nio 為 false 時適用。NIO 不使用套接字工廠。 |
TcpSocketSupport 策略介面
以下清單顯示了 TcpSocketSupport 策略介面的定義
public interface TcpSocketSupport {
void postProcessServerSocket(ServerSocket serverSocket);
void postProcessSocket(Socket socket);
}
此介面的實現可以在套接字建立之後以及應用所有配置屬性之後但在使用套接字之前修改套接字。這適用於是否使用 NIO。例如,您可以使用此介面的實現來修改 SSL 套接字上支援的密碼套件,或者您可以新增一個在 SSL 握手完成後收到通知的偵聽器。框架提供的唯一實現是 DefaultTcpSocketSupport,它不會以任何方式修改套接字。
要提供您自己的 TcpSocketFactorySupport 或 TcpSocketSupport 實現,請透過分別設定 socket-factory-support 和 socket-support 屬性,向連線工廠提供您的自定義型別 bean 的引用。
TcpNetConnectionSupport 策略介面
以下清單顯示了 TcpNetConnectionSupport 策略介面的定義
public interface TcpNetConnectionSupport {
TcpNetConnection createNewConnection(Socket socket,
boolean server, boolean lookupHost,
ApplicationEventPublisher applicationEventPublisher,
String connectionFactoryName) throws Exception;
}
此介面用於建立 TcpNetConnection 型別(或其子類)的物件。框架提供了一個單一實現(DefaultTcpNetConnectionSupport),它預設建立簡單的 TcpNetConnection 物件。它有兩個屬性:pushbackCapable 和 pushbackBufferSize。當啟用回推時,該實現返回一個子類,它將連線的 InputStream 包裝在一個 PushbackInputStream 中。與 PushbackInputStream 的預設值一致,緩衝區大小預設為 1。這允許反序列化器“取消讀取”(回推)位元組到流中。下面的簡單示例顯示瞭如何在委託反序列化器中使用它,該反序列化器“窺視”第一個位元組以確定要呼叫的反序列化器
public class CompositeDeserializer implements Deserializer<byte[]> {
private final ByteArrayStxEtxSerializer stxEtx = new ByteArrayStxEtxSerializer();
private final ByteArrayCrLfSerializer crlf = new ByteArrayCrLfSerializer();
@Override
public byte[] deserialize(InputStream inputStream) throws IOException {
PushbackInputStream pbis = (PushbackInputStream) inputStream;
int first = pbis.read();
if (first < 0) {
throw new SoftEndOfStreamException();
}
pbis.unread(first);
if (first == ByteArrayStxEtxSerializer.STX) {
this.receivedStxEtx = true;
return this.stxEtx.deserialize(pbis);
}
else {
this.receivedCrLf = true;
return this.crlf.deserialize(pbis);
}
}
}
TcpNioConnectionSupport 策略介面
以下清單顯示了 TcpNioConnectionSupport 策略介面的定義
public interface TcpNioConnectionSupport {
TcpNioConnection createNewConnection(SocketChannel socketChannel,
boolean server, boolean lookupHost,
ApplicationEventPublisher applicationEventPublisher,
String connectionFactoryName) throws Exception;
}
此介面用於建立 TcpNioConnection 物件(或子類物件)。Spring Integration 提供了兩種實現:DefaultTcpNioSSLConnectionSupport 和 DefaultTcpNioConnectionSupport。使用哪一種取決於是否使用 SSL。一個常見的用例是子類化 DefaultTcpNioSSLConnectionSupport 並覆蓋 postProcessSSLEngine。請參閱SSL 客戶端認證示例。與 DefaultTcpNetConnectionSupport 一樣,這些實現也支援回推。
示例:啟用 SSL 客戶端認證
在使用 SSL 時啟用客戶端證書認證,該技術取決於是否使用 NIO。當不使用 NIO 時,提供一個自定義的 TcpSocketSupport 實現來後處理伺服器套接字
serverFactory.setTcpSocketSupport(new DefaultTcpSocketSupport() {
@Override
public void postProcessServerSocket(ServerSocket serverSocket) {
((SSLServerSocket) serverSocket).setNeedClientAuth(true);
}
});
(當您使用 XML 配置時,透過設定 socket-support 屬性來提供您的 bean 的引用)。
當您使用 NIO 時,提供一個自定義的 TcpNioSslConnectionSupport 實現來後處理 SSLEngine,如下例所示
@Bean
public DefaultTcpNioSSLConnectionSupport tcpNioConnectionSupport() {
return new DefaultTcpNioSSLConnectionSupport(serverSslContextSupport) {
@Override
protected void postProcessSSLEngine(SSLEngine sslEngine) {
sslEngine.setNeedClientAuth(true);
}
}
}
@Bean
public TcpNioServerConnectionFactory server() {
...
serverFactory.setTcpNioConnectionSupport(tcpNioConnectionSupport());
...
}
(當您使用 XML 配置時,自 4.3.7 版以來,透過設定 nio-connection-support 屬性來提供您的 bean 的引用)。