跳到主要内容
版本:7.0.2

高级技巧

DeepSeek V3 中英对照 Advanced Techniques

本节涵盖了一些高级技巧,这些技巧在某些情况下可能会对您有所帮助。

策略接口

在许多情况下,前面描述的配置足以实现基于 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)。