Apache Ftp Server 学习总结
Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能。Apache FtpServer 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring 相集成的模块。
用户管理主要对于FTP的用户进行管理,包括用户名,用户密码,用户的根目录,用户的写权限,登陆超时,最大连接数,最多连接ip数,上传速度,下载速度。
Apache Ftp Server 提供多种方式的用户注册:文件、URL、数据库、手动注册等
文件注册用户是最常用,也是用的最多的方式,你可以通过配置users.properties来实现。
users.properties:
//用户的根目录
ftpserver.user.admin.homedirectory=/ftproot
//用户的密码,是加密过的密码(加密方式有2种,MD5和SHA)
ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
//用户是否有效
ftpserver.user.admin.enableflag=true
//用户的写权限
ftpserver.user.admin.writepermission=true
//用户的超时时间
ftpserver.user.admin.idletime=0
//用户的最大登陆数
ftpserver.user.admin.maxloginnumber=0
//用户的最大ip连接数
ftpserver.user.admin.maxloginperip=0
//上传速度
ftpserver.user.admin.uploadrate=0
//下载速度
ftpserver.user.admin.downloadrate=0
users.properties加载方式有2种,一种通过依赖ftpd-typical.xml或是ftpd-full.xml来加载
另一种是通过手动代码的形式加载。
1) 依赖ftpd-typical.xml或是ftpd-full.xml来加载
ftpd-typical.xml的配置:
xmlversion="1.0"encoding="UTF-8"?>
<serverxmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mina.apache.org/ftpserver/spring/v1http://mina.apache.org/ftpserver/ftpserver-1.0.xsd
"
id="myServer">
<listeners>
<nio-listenername="default"port="2121">
nio-listener>
listeners>
用户管理配置文件-->
<file-user-managerfile=" users.properties"/>
server>
//启动方式
CommandLine.main(newString[]{"ftpd-typical.xml"});
2)手动加载
代码:
//ftp服务工厂
FtpServerFactory serverFactory = newFtpServerFactory();
//用户管理工厂
PropertiesUserManagerFactoryuserManagerFactory = new PropertiesUserManagerFactory();
//file
userManagerFactory.setFile(new File("users.properties"));
//用户管理工厂创建用户管理对象注册到ftp服务工厂的ftp服务上下文中。 serverFactory.setUserManager(userManagerFactory.createUserManager());
//启动方式
FtpServer server = serverFactory.createServer();
server.start();
url注册用户不需要users.properties配置文件,而已通过URL远程获取用户信息。
加载方式同上。
1) 依赖ftpd-typical.xml或是ftpd-full.xml来加载
ftpd-typical.xml的配置:
xmlversion="1.0"encoding="UTF-8"?>
<serverxmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mina.apache.org/ftpserver/spring/v1http://mina.apache.org/ftpserver/ftpserver-1.0.xsd
"
id="myServer">
<listeners>
<nio-listenername="default"port="2121">
nio-listener>
listeners>
用户管理配置文件-->
<file-user-managerurl=" 具体的url地址"/>
server>
//启动方式
CommandLine.main(newString[]{"ftpd-typical.xml"});
2)手动加载
代码:
//ftp服务工厂
FtpServerFactory serverFactory = newFtpServerFactory();
//用户管理工厂
PropertiesUserManagerFactoryuserManagerFactory = new PropertiesUserManagerFactory();
//url
userManagerFactory.setUrl(newURL("具体的url地址"));
//用户管理工厂创建用户管理对象注册到ftp服务工厂的ftp服务上下文中。 serverFactory.setUserManager(userManagerFactory.createUserManager());
//启动方式
FtpServer server =serverFactory.createServer();
server.start();
如果使用数据库管理用户,首先需要建一张用户表
表实体:
userid, //用户名
userpassword,//用户密码
homedirectory, //用户根目录
enableflag, //是否有效
writepermission, //写权限
idletime, //登陆超时
uploadrate,//上传速度
downloadrate//下载速度
2) 依赖ftpd-typical.xml或是ftpd-full.xml来加载
ftpd-typical.xml的配置:
xmlversion="1.0"encoding="UTF-8"?>
<serverxmlns="http://mina.apache.org/ftpserver/spring/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd
"
id="myServer">
<listeners>
<nio-listenername="default"port="2121">
nio-listener>
listeners>
用户管理配置文件-->
<db-user-manager>
<data-source>
<beans:beanclass="some.datasoure.class"/>
data-source>
<insert-user>INSERT INTO FTP_USER (userid,userpassword,
homedirectory, enableflag, writepermission,idletime,uploadrate,
downloadrate) VALUES ('{userid}', '{userpassword}',
'{homedirectory}',
{enableflag}, {writepermission}, {idletime},
{uploadrate},
{downloadrate})
insert-user>
<update-user>UPDATE FTP_USER SET
userpassword='{userpassword}',homedirectory='{homedirectory}',enableflag={enableflag},writepermission={writepermission},idletime={idletime},uploadrate={uploadrate},downloadrate={downloadrate}
WHERE userid='{userid}'
update-user>
<delete-user>DELETE FROM FTP_USER WHEREuserid = '{userid}'
delete-user>
<select-user>SELECTuserid, userpassword, homedirectory,
enableflag, writepermission, idletime,uploadrate,downloadrate,
maxloginnumber, maxloginperip FROM
FTP_USER WHERE userid = '{userid}'
select-user>
<select-all-users>SELECTuserid FROM FTP_USER ORDER BY userid
select-all-users>
<is-admin>SELECTuserid FROM FTP_USER WHERE userid='{userid}'
AND
userid='admin'
is-admin>
<authenticate>SELECTuserpassword from FTP_USER WHERE
userid='{userid}'authenticate>
db-user-manager>
server>
//启动方式
CommandLine.main(newString[]{"ftpd-typical.xml"});
2)手动加载
代码:
//ftp服务工厂
FtpServerFactory serverFactory = newFtpServerFactory();
//用户管理工厂
DbUserManagerFactory dbUserManagerFactory=newDbUserManagerFactory();
//设置dbUserManagerFactory的属性
dbUserManagerFactory.setSqlUserAdmin("SELECT userid FROM FTP_USER WHEREuserid='{userid}'" +
" AND userid='admin'");
dbUserManagerFactory.setSqlUserAuthenticate("SELECT userpassword from FTP_USER WHEREuserid='{userid}'");
dbUserManagerFactory.setSqlUserDelete("DELETE FROM FTP_USER WHERE userid = '{userid}'");
dbUserManagerFactory.setSqlUserInsert("INSERT INTO FTP_USER (userid,userpassword,homedirectory, enableflag, " +
"writepermission, idletime, uploadrate,downloadrate)VALUES ('{userid}', '{userpassword}'," +
"'{homedirectory}',{enableflag}, {writepermission},{idletime},{uploadrate},{downloadrate})");
dbUserManagerFactory.setSqlUserSelect("SELECT userid, userpassword, homedirectory," +
" enableflag, writepermission, idletime, uploadrate,downloadrate,maxloginnumber, maxloginperip FROM" +
" FTP_USER WHERE userid = '{userid}'");
dbUserManagerFactory.setSqlUserSelectAll("SELECT userid FROM FTP_USER ORDER BY userid");
dbUserManagerFactory.setSqlUserUpdate(" UPDATE FTP_USER SET userpassword='{userpassword}',homedirectory='{homedirectory}'," +
"enableflag={enableflag},writepermission={writepermission},idletime={idletime},uploadrate={uploadrate},downloadrate={downloadrate}" +
" WHERE userid='{userid}'");
//数据源
dbUserManagerFactory.setDataSource(dataSource);
//用户管理工厂创建用户管理对象注册到ftp服务工厂的ftp服务上下文中。 serverFactory.setUserManager(userManagerFactory.createUserManager());
//启动方式
FtpServer server =serverFactory.createServer();
server.start();
手动注册只提供注册的接口,对数据的来源不做要求,可以来自数据库,文件,远程资源等等。
这里只提供方式,不做具体的实现:
1) 手动注册到内存中。
//ftp服务工厂
FtpServerFactoryserverFactory = new FtpServerFactory();
//用户管理工厂
PropertiesUserManagerFactory userManagerFactory = newPropertiesUserManagerFactory();
//用户管理对象
UserManager userManager=userManagerFactory.createUserManager();
//用户实例
BaseUser user=new BaseUser();
//填充用户的数据(需要用户自己实现)
//手动注册用户
userManager.save(user);
//用户管理对象注册到ftp服务工厂的ftp服务上下文中。
serverFactory.setUserManager(userManager);
//启动方式
FtpServer server =serverFactory.createServer();
server.start();
2) 手动注册到数据库,
//ftp服务工厂
FtpServerFactory serverFactory = newFtpServerFactory();
//用户管理工厂
DbUserManagerFactoryuserManagerFactory = new DbUserManagerFactory();
//用户管理对象
UserManageruserManager=userManagerFactory.createUserManager();
//用户实例
BaseUser user=new BaseUser();
//填充用户的数据(需要用户自己实现)
//手动注册用户
userManager.save(user);
//用户管理对象注册到ftp服务工厂的ftp服务上下文中。
serverFactory.setUserManager(userManager);
//启动方式
FtpServer server =serverFactory.createServer();
server.start();
如果想要对ftpserver启动后,修改或删除用户的信息,并使之生效。
1) 如果是配置文件或是URL
可以调用下面的方法来修改。
((PropertiesUserManager)serverFactory.getUserManager()).refresh();
2) 如果是数据库
((DbUserManager)serverFactory.getUserManager()).save(user);
3) 如果是手动注册
((PropertiesUserManager)serverFactory.getUserManager()).delete(usrName);
((PropertiesUserManager)serverFactory.getUserManager()).save(user);
支持中文,其实说起来很简单,只需要保持两边的编码一致。也就是说,发送方的编码和接收方的解码一致。Apache Ftp Server 默认的编码是“UTF-8“。
一种是使用Apache Ftp Server提供的用户接口UserManager和权限接口Authority,重新实现。
另一种,就是重写Apache Ftp Server的所有命令。其实是把命令执行中的用户和权限替换成第三方,完全可以抛弃掉Apache Ftp Server的用户和权限体系