此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
本部分介绍在某些情况下可能有用的高级技术。
策略接口
在许多情况下,只需前面描述的配置即可通过 TCP/IP 实现安全通信。 但是,Spring Integration 提供了许多策略接口,以允许自定义和修改套接字工厂和套接字:
-
TcpSSLContextSupport
-
TcpSocketFactorySupport
-
TcpSocketSupport
-
TcpNetConnectionSupport
-
TcpNioConnectionSupport
策略界面TcpSSLContextSupport
以下列表显示了策略接口:TcpSSLContextSupport
public interface TcpSSLContextSupport {
SSLContext getSSLContext() throws Exception;
}
接口的实现负责创建对象。
该框架提供的实现是前面描述的 。
如果需要不同的行为,请实现此接口,并为连接工厂提供对类实现的 Bean 的引用。TcpSSLContextSupport
SSLContext
DefaultTcpSSLContextSupport
策略界面TcpSocketFactorySupport
以下列表显示了策略接口的定义:TcpSocketFactorySupport
public interface TcpSocketFactorySupport {
ServerSocketFactory getServerSocketFactory();
SocketFactory getSocketFactory();
}
此接口的实现负责获取对 和 的引用。
提供了两种实现。
第一种是用于非 SSL 套接字(未定义任何属性时)。
这将使用 JDK 的默认工厂。
第二个实现是 。
默认情况下,在定义属性时使用此选项。
它使用该 Bean 创建的 bean 来创建套接字工厂。ServerSocketFactory
SocketFactory
DefaultTcpNetSocketFactorySupport
ssl-context-support
DefaultTcpNetSSLSocketFactorySupport
ssl-context-support
SSLContext
仅当 为 时,此接口才适用。
蔚来不使用插座工厂。using-nio false |
策略界面TcpSocketSupport
以下列表显示了策略接口的定义:TcpSocketSupport
public interface TcpSocketSupport {
void postProcessServerSocket(ServerSocket serverSocket);
void postProcessSocket(Socket socket);
}
此接口的实现可以在创建套接字之后,在应用所有配置的属性之后,但在使用套接字之前修改套接字。
无论您是否使用蔚来汽车,这都适用。
例如,您可以使用此接口的实现来修改 SSL 套接字上支持的密码套件,也可以添加一个侦听器,该侦听器在 SSL 握手完成后收到通知。
框架提供的唯一实现是 ,它不会以任何方式修改套接字。DefaultTcpSocketSupport
要提供您自己的 or 实现,请分别通过设置 和 属性,为连接工厂提供对定制类型的 Bean 的引用。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;
}
调用此接口以创建类型(或其子类)的对象。
该框架提供了一个实现 (),默认情况下,它创建简单的对象。
它有两个属性:和 。
启用回推后,实现将返回一个子类,该子类将连接包装在 .
与默认值一致,缓冲区大小默认为 1。
这允许反序列化程序将字节“取消读取”(推回)到流中。
以下简单示例演示了如何在委派反序列化程序中使用它,该反序列化程序“窥视”第一个字节以确定要调用哪个反序列化程序:TcpNetConnection
DefaultTcpNetConnectionSupport
TcpNetConnection
pushbackCapable
pushbackBufferSize
InputStream
PushbackInputStream
PushbackInputStream
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;
}
调用此接口以创建对象(或来自子类的对象)。
Spring Integration 提供了两种实现:和 。
使用哪一个取决于是否正在使用 SSL。
一个常见的用例是子类化和覆盖 。
请参阅 SSL 客户端身份验证示例。
与 一样,这些实现也支持回推。TcpNioConnection
DefaultTcpNioSSLConnectionSupport
DefaultTcpNioConnectionSupport
DefaultTcpNioSSLConnectionSupport
postProcessSSLEngine
DefaultTcpNetConnectionSupport
仅当 为 时,此接口才适用。
蔚来不使用插座工厂。using-nio false |
示例:启用 SSL 客户端身份验证
要在使用 SSL 时启用客户端证书身份验证,该技术取决于您是否使用 NIO。
当您不 NIO 时,提供自定义实现来后处理服务器套接字:TcpSocketSupport
serverFactory.setTcpSocketSupport(new DefaultTcpSocketSupport() {
@Override
public void postProcessServerSocket(ServerSocket serverSocket) {
((SSLServerSocket) serverSocket).setNeedClientAuth(true);
}
});
(使用 XML 配置时,通过设置属性来提供对 Bean 的引用)。socket-support
使用 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());
...
}
(从 4.3.7 版开始使用 XML 配置时,通过设置属性来提供对 Bean 的引用)。nio-connection-support