高階技術

本節介紹了一些您在特定情況下可能會覺得有用的高階技術。

策略介面

在許多情況下,前面描述的配置足以啟用 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();

}

此介面的實現負責獲取 ServerSocketFactorySocketFactory 的引用。提供了兩種實現。第一種是用於非 SSL 套接字的 DefaultTcpNetSocketFactorySupport(未定義 ssl-context-support 屬性時)。它使用 JDK 的預設工廠。第二種實現是 DefaultTcpNetSSLSocketFactorySupport。預設情況下,定義了 ssl-context-support 屬性時使用此實現。它使用該 bean 建立的 SSLContext 來建立套接字工廠。

此介面僅在 using-niofalse 時適用。NIO 不使用套接字工廠。

TcpSocketSupport 策略介面

以下列表顯示了 TcpSocketSupport 策略介面的定義

public interface TcpSocketSupport {

    void postProcessServerSocket(ServerSocket serverSocket);

    void postProcessSocket(Socket socket);

}

此介面的實現可以在套接字建立後、所有配置屬性應用後以及套接字使用前修改它們。無論您是否使用 NIO,這都適用。例如,您可以使用此介面的實現來修改 SSL 套接字上支援的密碼套件,或者您可以新增一個在 SSL 握手完成後收到通知的監聽器。框架提供的唯一實現是 DefaultTcpSocketSupport,它不會以任何方式修改套接字。

要提供您自己的 TcpSocketFactorySupportTcpSocketSupport 實現,請透過設定 socket-factory-supportsocket-support 屬性,分別為連線工廠提供您的自定義型別 bean 的引用。

TcpNetConnectionSupport 策略介面

以下列表顯示了 TcpNetConnectionSupport 策略介面的定義

public interface TcpNetConnectionSupport {

    TcpNetConnection createNewConnection(Socket socket,
            boolean server, boolean lookupHost,
            ApplicationEventPublisher applicationEventPublisher,
            String connectionFactoryName) throws Exception;

}

此介面用於建立 TcpNetConnection 型別物件(或其子類)。框架提供了一個單一實現 (DefaultTcpNetConnectionSupport),它預設建立簡單的 TcpNetConnection 物件。它有兩個屬性:pushbackCapablepushbackBufferSize。啟用回推時,實現會返回一個子類,該子類將連線的 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 提供了兩種實現:DefaultTcpNioSSLConnectionSupportDefaultTcpNioConnectionSupport。使用哪種取決於是否使用了 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 引用。)