進階技巧

本節涵蓋您在特定情況下可能會發現有用的進階技巧。

策略介面

在許多情況下,先前描述的設定已足以啟用透過 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();

}

此介面的實作負責取得對 ServerSocketFactorySocketFactory 的參考。提供了兩個實作。第一個是 DefaultTcpNetSocketFactorySupport,用於非 SSL Socket(當未定義 ssl-context-support 屬性時)。這使用 JDK 的預設工廠。第二個實作是 DefaultTcpNetSSLSocketFactorySupport。預設情況下,當定義了 ssl-context-support 屬性時,會使用此實作。它使用該 Bean 建立的 SSLContext 來建立 Socket 工廠。

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

TcpSocketSupport 策略介面

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

public interface TcpSocketSupport {

    void postProcessServerSocket(ServerSocket serverSocket);

    void postProcessSocket(Socket socket);

}

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

若要提供您自己的 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 實作來後處理伺服器 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 的參考)。