对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

先进技术

本节介绍在某些情况下可能会发现有用的高级技术。spring-doc.cadn.net.cn

策略接口

在许多情况下,前面描述的配置是启用通过 TCP/IP 进行安全通信所需的全部内容。 但是,Spring Integration 提供了许多策略接口来允许自定义和修改套接字工厂和套接字: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属性。 它使用SSLContext由该 bean 创建以创建套接字工厂。spring-doc.cadn.net.cn

此接口仅适用于以下情况using-niofalse. 蔚来汽车不使用插座工厂。

TcpSocketSupport策略界面

以下列表显示了TcpSocketSupport策略接口:spring-doc.cadn.net.cn

public interface TcpSocketSupport {

    void postProcessServerSocket(ServerSocket serverSocket);

    void postProcessSocket(Socket socket);

}

此接口的实现可以在创建套接字后以及应用所有配置的属性之后但在使用套接字之前修改套接字。 无论您是否使用蔚来汽车,这都适用。 例如,您可以使用此接口的实现来修改 SSL 套接字上支持的密码套件,或者可以添加一个侦听器,该侦听器在 SSL 握手完成后收到通知。 该框架提供的唯一实现是DefaultTcpSocketSupport,它不会以任何方式修改套接字。spring-doc.cadn.net.cn

提供您自己的实现TcpSocketFactorySupportTcpSocketSupport,通过设置socket-factory-supportsocket-support属性。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. 启用后推后,实现返回一个子类,该子类包装连接的InputStreamPushbackInputStream. 与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属性)。spring-doc.cadn.net.cn

当您使用蔚来时,请提供自定义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属性)。spring-doc.cadn.net.cn