一、情景
項目由於需要支援大檔案傳輸和下載,用到了開源的Apache FtpServer(http://mina.apache.org/ftpserver/)。但是,為了配合用戶端使用,這些FTP命令並不能滿足需求,即需要增加一些命令,也需要刪除或者修改一些對於整個系統可能帶來安全問題的命令。
二、修改Apache
FtpServer的大致思路
1. 新增加命令,則增加具體的實作類別,繼承AbstractCommand,實現execute()方法。
2. 自訂一個類MyCommandFactoryFactory,對DEFAULT_COMMAND_MAP進行初始化控制,增加自己定義的命令。
具體代碼可以參考org.apache.ftpserver.command.CommandFactoryFactory,基本類似。
3. 在server啟動之前,重新設定CommandFactory。
serverFactory.setCommandFactory((new
MyCommandFactoryFactory()).createCommandFactory());
(另外:也可以直接修改CommandFactoryFactory的代碼,這樣比較簡單。但是一般情況下,如果對於開源包有更改,還是建議繼承或者重寫相關的類,這樣以後升級使用的包更容易些。)
三、如何對定製後的FtpServer測試
對於定製後的FtpServer,因為命令已經改變,使用傳統的一些FTP工具就無法對Server進行測試了。這就需要自己寫一個同樣是定製過的簡單的Ftp用戶端來進行測試。Apache提供的commonnet包(http://commons.apache.org/net/)對於Ftp協議進行了支援,並且是開源的,所以可以直接修改commonnet的代碼,提供一個定製版本的commonnet,以對定製的Ftp命令進行支援。然後再使用定製版本的commonnet寫一個簡單的Ftp用戶端。
四、修改commonnet代碼的大致思路
1. org.apache.commons.net.ftp.FTPCommand類
代碼不多,很容易懂。需要修改或者增加命令。
2. org.apache.commons.net.ftp.FTP類
這個類封裝了Ftp用戶端的主要功能。增加或者修改具體的方法。
3. org.apache.commons.net.ftp.FtpClient類
這個類是對外提供服務的。增加或者修改具體的方法。
註:因為不能涉及具體業務,所以寫的不夠詳細,見諒。基本思路已經寫出來了,按照這個思路,再仔細看看代碼,應該沒問題的。