此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
先进技术
本节介绍在某些情况下可能会发现有用的高级技术。
策略接口
在许多情况下,前面描述的配置是启用通过 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();
}
此接口的实现负责获取对ServerSocketFactory
和SocketFactory
.
提供了两种实现。
首先是DefaultTcpNetSocketFactorySupport
对于非 SSL 套接字(当没有ssl-context-support
属性)。
这使用 JDK 的默认工厂。
第二个实现是DefaultTcpNetSSLSocketFactorySupport
.
默认情况下,当ssl-context-support
属性。
它使用SSLContext
由该 bean 创建以创建套接字工厂。
此接口仅适用于以下情况using-nio 是false .
蔚来汽车不使用插座工厂。 |
这TcpSocketSupport
策略界面
以下列表显示了TcpSocketSupport
策略接口:
public interface TcpSocketSupport {
void postProcessServerSocket(ServerSocket serverSocket);
void postProcessSocket(Socket socket);
}
此接口的实现可以在创建套接字后以及应用所有配置的属性之后但在使用套接字之前修改套接字。
无论您是否使用蔚来汽车,这都适用。
例如,您可以使用此接口的实现来修改 SSL 套接字上支持的密码套件,或者可以添加一个侦听器,该侦听器在 SSL 握手完成后收到通知。
该框架提供的唯一实现是DefaultTcpSocketSupport
,它不会以任何方式修改套接字。
提供您自己的实现TcpSocketFactorySupport
或TcpSocketSupport
,通过设置socket-factory-support
和socket-support
属性。
这TcpNetConnectionSupport
策略界面
以下列表显示了TcpNetConnectionSupport
策略接口:
public interface TcpNetConnectionSupport {
TcpNetConnection createNewConnection(Socket socket,
boolean server, boolean lookupHost,
ApplicationEventPublisher applicationEventPublisher,
String connectionFactoryName) throws Exception;
}
调用此接口以创建类型TcpNetConnection
(或其子类)。
该框架提供了一个单一的实现(DefaultTcpNetConnectionSupport
),默认情况下,它会创建简单的TcpNetConnection
对象。
它有两个属性:pushbackCapable
和pushbackBufferSize
.
启用后推后,实现返回一个子类,该子类包装连接的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 提供了两种实现:DefaultTcpNioSSLConnectionSupport
和DefaultTcpNioConnectionSupport
.
使用哪一个取决于是否正在使用 SSL。
一个常见的用例是将DefaultTcpNioSSLConnectionSupport
并覆盖postProcessSSLEngine
.
请参阅 SSL 客户端身份验证示例。
与DefaultTcpNetConnectionSupport
,这些实现也支持 push back。
示例:启用 SSL 客户端身份验证
要在使用 SSL 时启用客户端证书身份验证,该技术取决于您是否使用 NIO。
当你不NIO时,提供自定义TcpSocketSupport
实现对服务器套接字进行后处理:
serverFactory.setTcpSocketSupport(new DefaultTcpSocketSupport() {
@Override
public void postProcessServerSocket(ServerSocket serverSocket) {
((SSLServerSocket) serverSocket).setNeedClientAuth(true);
}
});
(当您使用 XML 配置时,通过设置socket-support
属性)。
当您使用蔚来时,请提供自定义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
属性)。