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 Integration 也支援 SFTP 會話的快取。有關更多資訊,請參閱SFTP 會話快取

DefaultSftpSessionFactory 可以使用外部配置或擴充套件的 SshClient。例如,可以使用 org.eclipse.jgit:org.eclipse.jgit.ssh.apache 庫中的 org.eclipse.jgit.internal.transport.sshd.JGitSshClient 擴充套件來提供 HTTP/SOCKS 代理支援。

SshClient 支援透過一個連線到伺服器建立多個通道(操作)。預設情況下,Spring Integration 會話工廠為每個通道使用單獨的物理連線。自 Spring Integration 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 時,所有請求的 SftpSession 例項都使用單個 SftpClient。預設為 false

sftpVersionSelector::用於 SFTP 協議選擇的 SftpVersionSelector 例項。預設值是 SftpVersionSelector.CURRENT

host::要連線的主機 URL。必需。

hostConfig::org.apache.sshd.client.config.hosts.HostConfigEntry 例項,作為 user/host/port 選項的替代。可以使用代理跳板屬性進行配置。

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::timeout 屬性用作套接字超時引數以及預設連線超時。預設為 30 秒。設定為 0 表示沒有超時;設定為 null 表示無限等待。

allowUnknownKeys::設定為 true 以允許連線到金鑰未知(或更改)的主機。預設值為 'false'。如果為 false,則需要預先填充的 knownHosts 檔案。

userInteraction::自定義的 org.apache.sshd.client.auth.keyboard.UserInteraction,用於認證期間。

從 6.4 版本開始,DefaultSftpSessionFactory 暴露了一個 Consumer<SshClient> configurer 屬性,用於進一步自定義內部的 SshClient。例如,這是如何更改客戶端預設的 NIO 工作執行緒數和包大小的示例:

sftpSessionFactory.setSshClientConfigurer((sshClient) -> {
    sshClient.setNioWorkers(27);
    PropertyResolverUtils.updateProperty(sshClient, CoreModuleProperties.MAX_PACKET_SIZE.getName(), 48 * 1024);
});