SFTP Session Factory

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

在配置 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 Integration 还支持对 SFTP 会话进行缓存。请参阅 SFTP Session Caching了解更多信息。

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

SshClient 支持通过与服务器的连接进行多个频道(操作)。默认情况下,Spring 集成会话工厂为每个频道使用一个单独的物理连接。从 Spring 集成 3.0 开始,您可以配置会话工厂(使用布尔构造函数参数 - 默认 false)以使用到服务器的单个连接,并在该单个连接上创建多个 SftpClient 实例。 在使用此功能时,必须使用缓存会话工厂来封装会话工厂(如 described later),这样在某个操作完成时,不会物理关闭连接。 如果重置了高速缓存,则只会在关闭最后一个频道时断开会话。 当新操作获得会话时,如果连接要断开,则该连接将刷新。

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

为 SFTP 会话工厂提供值的更实际的方式是使用 Spring 的 property placeholder support

从版本 6.1.3 开始,DefaultSftpSessionFactory 引入了 createSftpClient(…​) 来支持自定义 SftpClient。请参见下面在自定义 SftpClient 中覆盖 createSftpChannelSubsystem() 方法的示例,以便添加自定义 RequestHandler 以处理 SFTP 子系统请求和答复:

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

Configuration Properties

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

isSharedSession(构造函数参数):如果为 true,则对所有请求的 SftpSession 实例都将使用单个 SftpClient。默认为 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 为假,则必须预先填充。

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,用于在身份验证期间使用。