高级技术
本节介绍了一些在特定情况下可能会有帮助的高级技术。
策略接口
在许多情况下,前面描述的配置足以实现通过 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
的引用。
提供了两种实现。
第一种是用于非 SSL 套接字(未定义 ssl-context-support
属性时)的 DefaultTcpNetSocketFactorySupport
。
它使用 JDK 的默认工厂。
第二种实现是 DefaultTcpNetSSLSocketFactorySupport
。
默认情况下,当定义了 ssl-context-support
属性时使用它。
它使用该 bean 创建的 SSLContext
来创建套接字工厂。
此接口仅适用于 |
TcpSocketSupport
策略接口
以下清单显示了 TcpSocketSupport
策略接口的定义:
public interface TcpSocketSupport {
void postProcessServerSocket(ServerSocket serverSocket);
void postProcessSocket(Socket socket);
}
此接口的实现可以在套接字创建后、所有配置属性应用后但在套接字使用前修改套接字。
这适用于无论您是否使用 NIO。
例如,您可以使用此接口的实现来修改 SSL 套接字上支持的密码套件,或者您可以添加一个在 SSL 握手完成后收到通知的监听器。
框架提供的唯一实现是 DefaultTcpSocketSupport
,它不以任何方式修改套接字。
要提供您自己的 TcpSocketFactorySupport
或 TcpSocketSupport
实现,请通过分别设置 socket-factory-support
和 socket-support
属性,为连接工厂提供对您自定义类型 bean 的引用。
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
一样,这些实现也支持回推。
示例:启用 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 的引用)。