進階技巧
本節涵蓋您在特定情況下可能會發現有用的進階技巧。
策略介面
在許多情況下,先前描述的設定已足以啟用透過 TCP/IP 的安全通訊。但是,Spring Integration 提供了許多策略介面,可自訂和修改 Socket 工廠和 Socket
-
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
的參考。提供了兩個實作。第一個是 DefaultTcpNetSocketFactorySupport
,用於非 SSL Socket(當未定義 ssl-context-support
屬性時)。這使用 JDK 的預設工廠。第二個實作是 DefaultTcpNetSSLSocketFactorySupport
。預設情況下,當定義了 ssl-context-support
屬性時,會使用此實作。它使用該 Bean 建立的 SSLContext
來建立 Socket 工廠。
此介面僅在 using-nio 為 false 時適用。NIO 不使用 Socket 工廠。 |
TcpSocketSupport
策略介面
以下列表顯示了 TcpSocketSupport
策略介面的定義
public interface TcpSocketSupport {
void postProcessServerSocket(ServerSocket serverSocket);
void postProcessSocket(Socket socket);
}
此介面的實作可以在建立 Socket 後,以及在套用所有設定的屬性之後但在使用 Socket 之前修改 Socket。無論您是否使用 NIO,這都適用。例如,您可以使用此介面的實作來修改 SSL Socket 上支援的密碼套件,或者您可以新增一個監聽器,該監聽器在 SSL 握手完成後收到通知。框架提供的唯一實作是 DefaultTcpSocketSupport
,它不會以任何方式修改 Socket。
若要提供您自己的 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
實作來後處理伺服器 Socket
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 的參考)。