SFTP 会话工厂

从 3.0 版本开始,默认情况下不再缓存会话。请参阅 SFTP 会话缓存

在配置 SFTP 适配器之前,必须配置 SFTP 会话工厂。您可以使用常规 bean 定义配置 SFTP 会话工厂,如下例所示

<beans:bean id="sftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <beans:property name="host" value="localhost"/>
    <beans:property name="privateKey" value="classpath:META-INF/keys/sftpTest"/>
    <beans:property name="privateKeyPassphrase" value="springIntegration"/>
    <beans:property name="port" value="22"/>
    <beans:property name="user" value="kermit"/>
</beans:bean>

每次适配器向其SessionFactory请求会话对象时,都会创建一个新的 SFTP 会话。在幕后,SFTP 会话工厂依赖于Apache MINA SSHD库来提供 SFTP 功能。

但是,Spring 集成也支持缓存 SFTP 会话。请参阅 SFTP 会话缓存了解更多信息。

DefaultSftpSessionFactory可以使用外部配置或扩展的SshClient。例如,可以使用org.eclipse.jgit:org.eclipse.jgit.ssh.apache库中的org.eclipse.jgit.internal.transport.sshd.JGitSshClient扩展来提供对 HTTP/SOCKS 代理的支持。

SshClient支持通过与服务器的连接进行多个通道(操作)。默认情况下,Spring 集成会话工厂为每个通道使用单独的物理连接。从 Spring 集成 3.0 开始,您可以配置会话工厂(使用布尔构造函数参数 - 默认值为false)以使用单个连接到服务器并在该单个连接上创建多个SftpClient实例。

使用此功能时,必须将会话工厂包装在缓存会话工厂中,如稍后所述,以便在操作完成后不会物理关闭连接。

如果重置缓存,只有在最后一个通道关闭时才会断开会话连接。

如果新操作获取会话时连接将要断开,则会刷新连接。

现在,您只需将此 SFTP 会话工厂注入您的适配器即可。

为 SFTP 会话工厂提供值的更实用方法是使用 Spring 的属性占位符支持

从 6.1.3 版本开始,DefaultSftpSessionFactory引入了createSftpClient(…)来支持自定义SftpClient。下面是一个示例,说明如何在自定义SftpClient中重写createSftpChannelSubsystem()方法以添加例如一些用于 SFTP 子系统请求和回复的自定义RequestHandler

@Override
protected ChannelSubsystem createSftpChannelSubsystem(ClientSession clientSession) {
    ChannelSubsystem sftpChannelSubsystem = super.createSftpChannelSubsystem(clientSession);
    sftpChannelSubsystem.addRequestHandler((channel, request, wantReply, buffer) -> ...);
    return sftpChannelSubsystem;
}

配置属性

以下列表描述了DefaultSftpSessionFactory公开的所有属性。

isSharedSession(构造函数参数):当设置为true时,单个SftpClient将用于所有请求的SftpSession实例。默认为false

sftpVersionSelector:用于 SFTP 协议选择的SftpVersionSelector实例。默认值为SftpVersionSelector.CURRENT

host:要连接到的主机的 URL。必需。

hostConfig:作为用户/主机/端口选项的替代方案的org.apache.sshd.client.config.hosts.HostConfigEntry实例。可以使用代理跳转属性进行配置。

port:应通过其建立 SFTP 连接的端口。如果未指定,则此值默认为22。如果指定,则此属性必须为正数。

user:要使用的远程用户。必需。

knownHostsResource:用于主机密钥存储库的org.springframework.core.io.Resource。资源的内容必须与 OpenSSH known_hosts文件的格式相同,并且如果allowUnknownKeys为 false,则必需且必须预先填充。

password:用于对远程主机进行身份验证的密码。如果没有提供密码,则需要privateKey属性。

privateKey:表示用于对远程主机进行身份验证的私钥位置的org.springframework.core.io.Resource。如果未提供privateKey,则需要password属性。

privateKeyPassphrase:私钥的密码。如果设置了userInfo,则不允许使用privateKeyPassphrase。密码是从该对象中获取的。可选。

timeout:超时属性用作套接字超时参数以及默认连接超时。默认为30 秒。设置为0表示没有超时;设置为null - 无限等待。

allowUnknownKeys:设置为true允许连接到具有未知(或已更改)密钥的主机。其默认值为“false”。如果为false,则需要预先填充的knownHosts文件。

userInteraction:在身份验证期间要使用的自定义org.apache.sshd.client.auth.keyboard.UserInteraction