一、情景
项目由于需要支持大文件传输和下载,用到了开源的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类
这个类是对外提供服务的。增加或者修改具体的方法。