如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

高级技术

本节介绍在某些情况下可能对您有帮助的高级技术。spring-doc.cadn.net.cn

策略接口

在许多情况下,前述配置已足以启用基于 TCP/IP 的安全通信。 然而,Spring Integration 提供了多种策略接口,允许对 Socket 工厂和 Socket 进行自定义和修改:spring-doc.cadn.net.cn

TcpSSLContextSupport策略接口

以下清单展示了 TcpSSLContextSupport 策略接口:spring-doc.cadn.net.cn

public interface TcpSSLContextSupport {

    SSLContext getSSLContext() throws Exception;

}

实现 TcpSSLContextSupport 接口的类负责创建 SSLContext 对象。 框架提供的实现是 DefaultTcpSSLContextSupport前文已描述。 如果您需要不同的行为,请实现此接口,并将连接工厂的引用指向您自己类实现的 Bean。spring-doc.cadn.net.cn

TcpSocketFactorySupport策略接口

以下清单展示了 TcpSocketFactorySupport 策略接口的定义:spring-doc.cadn.net.cn

public interface TcpSocketFactorySupport {

    ServerSocketFactory getServerSocketFactory();

    SocketFactory getSocketFactory();

}

此接口的实现负责获取对 ServerSocketFactorySocketFactory 的引用。 提供了两种实现方式。 第一种是 DefaultTcpNetSocketFactorySupport,用于非 SSL 套接字(当未定义 ssl-context-support 属性时)。 它使用 JDK 的默认工厂。 第二种实现是 DefaultTcpNetSSLSocketFactorySupport。 默认情况下,当定义了 ssl-context-support 属性时使用该实现。 它使用该 Bean 创建的 SSLContext 来创建套接字工厂。spring-doc.cadn.net.cn

此接口仅在 using-niofalse 时适用。 NIO 不使用套接字工厂。

TcpSocketSupport策略接口

以下清单展示了 TcpSocketSupport 策略接口的定义:spring-doc.cadn.net.cn

public interface TcpSocketSupport {

    void postProcessServerSocket(ServerSocket serverSocket);

    void postProcessSocket(Socket socket);

}

此接口的实现可以在套接字创建后且所有配置的属性已应用但尚未使用时修改套接字。 无论是否使用 NIO,此规则均适用。 例如,您可以使用该接口的实现来修改 SSL 套接字上支持的加密套件,或者添加一个监听器,以便在 SSL 握手完成后收到通知。 框架提供的唯一实现是 DefaultTcpSocketSupport,它不会以任何方式修改套接字。spring-doc.cadn.net.cn

要提供您自己的TcpSocketFactorySupportTcpSocketSupport实现,请通过分别设置socket-factory-supportsocket-support属性,向连接工厂提供对您自定义类型 Bean 的引用。spring-doc.cadn.net.cn

TcpNetConnectionSupport策略接口

以下清单展示了 TcpNetConnectionSupport 策略接口的定义:spring-doc.cadn.net.cn

public interface TcpNetConnectionSupport {

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

}

此接口用于创建类型为 TcpNetConnection(或其子类)的对象。 该框架提供了一个单一的实现 (DefaultTcpNetConnectionSupport),默认情况下会创建简单的 TcpNetConnection 对象。 它有两个属性:pushbackCapablepushbackBufferSize。 当启用回退(push back)时,该实现返回一个包装连接 InputStream 的子类,并将其封装在 PushbackInputStream 中。 与 PushbackInputStream 的默认值保持一致,缓冲区大小默认为 1。 这使得反序列化器能够将字节“回读”(推回)到流中。 以下简单示例展示了如何在委托反序列化器中使用它,该反序列化器会“窥视”第一个字节以确定调用哪个反序列化器:spring-doc.cadn.net.cn

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 策略接口的定义:spring-doc.cadn.net.cn

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类似,这些实现也支持反向推送(push back)。spring-doc.cadn.net.cn

示例:启用 SSL 客户端身份验证

当使用 SSL 启用客户端证书认证时,具体技术取决于您是否使用了 NIO。 如果您未使用 NIO,请提供一个自定义的 TcpSocketSupport 实现来对服务器套接字进行后处理:spring-doc.cadn.net.cn

serverFactory.setTcpSocketSupport(new DefaultTcpSocketSupport() {

    @Override
    public void postProcessServerSocket(ServerSocket serverSocket) {
        ((SSLServerSocket) serverSocket).setNeedClientAuth(true);
    }

});

(当您使用 XML 配置时,通过设置 socket-support 属性来引用您的 bean)。spring-doc.cadn.net.cn

当您使用 NIO 时,请提供自定义的 TcpNioSslConnectionSupport 实现以处理 SSLEngine 的后处理,如下例所示:spring-doc.cadn.net.cn

@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)。spring-doc.cadn.net.cn