Apache Ftp Server 学习总结

Apache Ftp Server  学习总结

1      介绍

Apache Ftp Server 是100%纯Java的FTP服务器软件,它采用MINA网络框架开发具有非常好的性能。Apache FtpServer 既可以嵌到Java应用中使用,也可以做为Windows服务或Unix/Linux Daemon单独运行。此外还提供与Spring 相集成的模块。

2      用户管理

用户管理主要对于FTP的用户进行管理,包括用户名,用户密码,用户的根目录,用户的写权限,登陆超时,最大连接数,最多连接ip数,上传速度,下载速度。

 

Apache Ftp Server  提供多种方式的用户注册:文件、URL、数据库、手动注册等

 

2.1    文件注册用户

文件注册用户是最常用,也是用的最多的方式,你可以通过配置users.properties来实现。

users.properties:

//用户的根目录

ftpserver.user.admin.homedirectory=/ftproot

//用户的密码,是加密过的密码(加密方式有2种,MD5SHA

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();

2.2    URL注册用户

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();

2.3    数据库管理用户

如果使用数据库管理用户,首先需要建一张用户表

表实体:

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();

2.4    手动注册

手动注册只提供注册的接口,对数据的来源不做要求,可以来自数据库,文件,远程资源等等。

这里只提供方式,不做具体的实现:

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();

2.5    修改或是删除用户

如果想要对ftpserver启动后,修改或删除用户的信息,并使之生效。

 

1)       如果是配置文件或是URL

可以调用下面的方法来修改。

((PropertiesUserManager)serverFactory.getUserManager()).refresh();

2)       如果是数据库

((DbUserManager)serverFactory.getUserManager()).save(user);

3)       如果是手动注册

((PropertiesUserManager)serverFactory.getUserManager()).delete(usrName);

((PropertiesUserManager)serverFactory.getUserManager()).save(user);

 

3      常见问题

3.1    如何支持中文,解决乱码

支持中文,其实说起来很简单,只需要保持两边的编码一致。也就是说,发送方的编码和接收方的解码一致。Apache Ftp Server 默认的编码是“UTF-8“。

3.2    如何使用第三方的用户和权限体系

一种是使用Apache Ftp Server提供的用户接口UserManager和权限接口Authority,重新实现。

另一种,就是重写Apache Ftp Server的所有命令。其实是把命令执行中的用户和权限替换成第三方,完全可以抛弃掉Apache Ftp Server的用户和权限体系

你可能感兴趣的:(java,ftp)