Apache FtpServer与Spring整

首先在application.xml(spring配置文件)添加Apache Ftpserver属性

 

01 <server xmlns="http://mina.apache.org/ftpserver/spring/v1"
02    xmlns:beans="http://www.springframework.org/schema/beans"
03    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
04    xsi:schemaLocation="
05       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
06       http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd    
07       "
08    id="myServer"
09     max-logins="500" 
10    anon-enabled="false"
11    max-login-failures="20"
12    login-failure-delay="30"
13    >
14  <listeners>
15<!-- port为FTP端口默认为21 idle-timeout为登录失效时间单位s-->
16         <nio-listener name="default" port="2121" idle-timeout="300">
17            <!--<ssl> ssl数据传输加密
18                <keystore file="ftpserver.jks" password="password" />
19            </ssl>-->
20        </nio-listener>
21  </listeners>
22  <!--FTP操作监听-->
23    <ftplets>
24             <ftplet name="ftplet1">
25             <beans:bean class="com.agnet.service.FtpService">
26  <!--属性注入-->
27              <!--    <beans:property name="foo" value="123" />-->
28            </beans:bean>
29        </ftplet>
30    </ftplets>
31<!--properties文件存放用户信息
32encrypt-passwords 默认为MD5加密,clear为明文密码,salted为加强MD5加密-->
33  <!--<file-user-manager file="users.properties" encrypt-passwords="clear"/>-->
34  <!-- 数据库存放用户信息
35  建表SQL
36  CREATE TABLE FTP_USER (      
37     userid VARCHAR(64) NOT NULL PRIMARY KEY,       
38     userpassword VARCHAR(64),      
39     homedirectory VARCHAR(128) NOT NULL,             
40     enableflag char(1) DEFAULT 1 check (enableflag in(0,1)),    
41     writepermission char(1) DEFAULT 1 check (writepermission in(0,1)),       
42     idletime INT DEFAULT 0,             
43     uploadrate INT DEFAULT 0,             
44     downloadrate INT DEFAULT 0,
45     maxloginnumber INT DEFAULT 0,
46     maxloginperip INT DEFAULT 0
47  );
48   -->
49     <db-user-manager encrypt-passwords="salted">
50        <data-source>
51             <beans:bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
52                 <beans:property name="driverClass" value="${common.c3p0.driver}" />
53                 <beans:property name="jdbcUrl" value="${common.c3p0.url}" />
54                 <beans:property name="user" value="${common.c3p0.username}" />
55                 <beans:property name="password" value="${common.c3p0.password}" />
56            </beans:bean>
57        </data-source>
58  <!--当为数据库存放时 apache FTPserver APi 函数需要调用的sql -->
59        <insert-user>INSERT INTO FTP_USER (userid, userpassword,
60            homedirectory, enableflag, writepermission, idletime, uploadrate,
61            downloadrate,maxloginnumber,maxloginperip) VALUES ('{userid}', '{userpassword}', '{homedirectory}',
62            '{enableflag}', '{writepermission}', {idletime}, {uploadrate},
63            {downloadrate},{maxloginnumber},{maxloginperip})</insert-user>
64        <update-user>
65            UPDATE FTP_USER SET
66                userpassword='{userpassword}',
67                homedirectory='{homedirectory}',
68                enableflag={enableflag},
69                writepermission={writepermission},
70                idletime={idletime},
71                uploadrate={uploadrate},
72                downloadrate={downloadrate},
73                maxloginnumber = {maxloginnumber},
74                maxloginperip = {maxloginperip}
75            WHERE userid='{userid}'
76        </update-user>
77        <delete-user>
78            DELETE FROM FTP_USER WHERE userid = '{userid}'
79        </delete-user>
80        <select-user>
81            SELECT userid, userpassword, homedirectory,
82                enableflag, writepermission, idletime, uploadrate, downloadrate,maxloginnumber,maxloginperip
83            FROM FTP_USER 
84            WHERE userid = '{userid}'
85        </select-user>
86        <select-all-users>
87            SELECT userid FROM FTP_USER ORDER BY userid
88        </select-all-users>
89        <is-admin>
90            SELECT userid 
91            FROM FTP_USER 
92            WHERE userid='{userid}' AND userid='admin'
93            </is-admin>
94        <authenticate>SELECT userpassword from FTP_USER WHERE userid='{userid}'</authenticate>
95    </db-user-manager>
96</server>

在web.xml中添加自己的容器启动关闭监听,目的是操作FTPserver

Web.xml:

1<!-- 容器 初始化监听 -->
2    <listener>
3<listener-class>com.base.listener.MyServletContextListener</listener-class>  </listener>

MyServletContextListener.java:

01 public class MyServletContextListener implements ServletContextListener {
02   
03     public static final String FTPSERVER_CONTEXT_NAME = "org.apache.ftpserver";
04       
05    //容器销毁
06     public void contextDestroyed(ServletContextEvent sce) {
07        System.out.println("Stopping FtpServer");
08        //停止FTP server
09        FtpServer server = (FtpServer) sce.getServletContext().getAttribute(FTPSERVER_CONTEXT_NAME);
10           
11        if(server != null) {
12            server.stop();
13               
14            sce.getServletContext().removeAttribute(FTPSERVER_CONTEXT_NAME);
15               
16            System.out.println("FtpServer stopped");
17         } else {
18            System.out.println("No running FtpServer found");
19        }
20           
21    }
22   
23    //容器初始化
24     public void contextInitialized(ServletContextEvent sce) {
25        /*在此如不希望容器启动里就开启FTPserver而是希望在页面通过手动开启
26System.out.println("Starting FtpServer");   
27   
28        WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
29           
30        FtpServer server = (FtpServer) ctx.getBean("myServer");
31           
32        sce.getServletContext().setAttribute(FTPSERVER_CONTEXT_NAME, server);
33           
34        try {
35            server.start();
36            System.out.println("FtpServer started");
37        } catch (Exception e) {
38            throw new RuntimeException("Failed to start FtpServer", e);
39         }*/     
40    }
41   
42}
01/**
02     * 开启FTPServer
03     * @param servletContext 可以从action中获得也可以ServletActionContext.getServletContext();
04     */
05     public boolean startFtpServer(ServletContext servletContext) {
06        System.out.println("Starting FtpServer");   
07   
08         boolean flg = true;
09         try {
10            FtpServer server = (FtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
11               
12            if(server != null) {
13                if(server.isSuspended())
14                    server.resume();//恢复
15                   
16            }else{
17                   
18                WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
19                   
20                server = (FtpServer) ctx.getBean("myServer");
21                   
22                servletContext.setAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME, server);
23                server.start();
24            }
25            System.out.println("FtpServer started");
26         } catch (Exception e) {
27            flg =  false;
28             throw new RuntimeException("Failed to start FtpServer", e);
29        }
30         return flg;
31    }

 

01//由于apache FTPserver不提供重启功能如果需要手动关闭serve可以将其进行挂起,以方便恢复
02/**
03     * 关闭FTPServer
04     * @param servletContext
05     * @return
06     */
07     public boolean stopFtpServer(ServletContext servletContext) {
08         System.out.println("Stopping FtpServer");
09               
10            FtpServer server = (FtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
11               
12            if(server != null) {
13                if(!server.isStopped()&&!server.isSuspended())
14                    server.suspend();
15                   
16                //servletContext.removeAttribute(FtpServerListener.FTPSERVER_CONTEXT_NAME);
17                   
18                System.out.println("FtpServer suspend");
19             } else {
20                System.out.println("No running FtpServer found");
21            }
22         return true;
23    }
01//对用户进行操作
02/**
03     * 申请FTP帐号
04     * @param userName
05     * @param sce 
06     * @return
07     * @throws FtpException 
08     */
09     public String applyAccount(String userName, ServletContext sce) throws FtpException {
10        String psw="";
11        //PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
12        //File f = new File(AgentFileService.class.getClassLoader().getResource("users.properties").getFile());
13        //userManagerFactory.setFile(f);
14        //DbUserManagerFactory userManagerFactory = new DbUserManagerFactory();
15        //明文密码保存于配置文件中 发面时改为MD5加密 同时修改配置文件applictionContext-ftp
16        //userManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor());
17        //UserManager um = userManagerFactory.createUserManager();
18        DefaultFtpServer server = (DefaultFtpServer) sce.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
19        if(server!=null){
20            UserManager um = server.getUserManager();
21            if(um.doesExist(userName)){
22                um.delete(userName);
23            }
24            psw = RandomStringUtils.randomAlphanumeric(8);
25             UserFactory userFact = new UserFactory();
26            userFact.setName(userName);
27            userFact.setPassword(psw);
28            userFact.setHomeDirectory("/home/myftpPath");
29            userFact.setMaxIdleTime(600000);//10分钟无操作自动断开连接
30             List<Authority> alist = new ArrayList<Authority>();
31             Authority a = new WritePermission();//写权限
32            alist.add(a);
33            userFact.setAuthorities(alist);
34            User user = userFact.createUser();
35            um.save(user);
36        }
37         return psw;
38    }
39   
40//删除用户
41   
42DefaultFtpServer server = (DefaultFtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
43             if (server != null) {
44                UserManager um = server.getUserManager();
45                String[] users = um.getAllUserNames();
46                 if (users != null && users.length > 0) {
47                     for (String userName : users) {
48                         if (!userName.equals(‘admin’)
49                                && um.doesExist(userName)) {
50                            um.delete(userName);
51                        }
52                    }
53                }
54            }

FTP操作监听

FtpService.java:

001 public class FtpService extends DefaultFtplet{
002    @Override
003     public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)
004             throws FtpException, IOException {
005           
006         return super.onUploadStart(session, request);
007    }
008   
009@Override
010     public void init(FtpletContext ftpletContext) throws FtpException {
011        // TODO Auto-generated method stub
012        super.init(ftpletContext);
013    }
014   
015    @Override
016     public void destroy() {
017        // TODO Auto-generated method stub
018        super.destroy();
019    }
020   
021    @Override
022     public FtpletResult onConnect(FtpSession session) throws FtpException,
023            IOException {
024        // TODO Auto-generated method stub
025         return super.onConnect(session);
026    }
027   
028    @Override
029     public FtpletResult onDisconnect(FtpSession session) throws FtpException,
030            IOException {
031        // TODO Auto-generated method stub
032         return super.onDisconnect(session);
033    }
034   
035    @Override
036     public FtpletResult beforeCommand(FtpSession session, FtpRequest request)
037             throws FtpException, IOException {
038        // TODO Auto-generated method stub
039         return super.beforeCommand(session, request);
040    }
041   
042    @Override
043     public FtpletResult afterCommand(FtpSession session, FtpRequest request,
044             FtpReply reply) throws FtpException, IOException {
045        // TODO Auto-generated method stub
046         return super.afterCommand(session, request, reply);
047    }
048   
049    @Override
050     public FtpletResult onLogin(FtpSession session, FtpRequest request)
051             throws FtpException, IOException {
052        // TODO Auto-generated method stub
053         return super.onLogin(session, request);
054    }
055   
056    @Override
057     public FtpletResult onDeleteStart(FtpSession session, FtpRequest request)
058             throws FtpException, IOException {
059        // TODO Auto-generated method stub
060         return super.onDeleteStart(session, request);
061    }
062   
063    @Override
064     public FtpletResult onDeleteEnd(FtpSession session, FtpRequest request)
065             throws FtpException, IOException {
066        // TODO Auto-generated method stub
067         return super.onDeleteEnd(session, request);
068    }
069   
070    @Override
071     public FtpletResult onUploadStart(FtpSession session, FtpRequest request)
072             throws FtpException, IOException {
073        // TODO Auto-generated method stub
074         return super.onUploadStart(session, request);
075    }
076   
077    @Override
078     public FtpletResult onDownloadStart(FtpSession session, FtpRequest request)
079             throws FtpException, IOException {
080        // TODO Auto-generated method stub
081         return super.onDownloadStart(session, request);
082    }
083   
084    @Override
085     public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request)
086             throws FtpException, IOException {
087        // TODO Auto-generated method stub
088         return super.onDownloadEnd(session, request);
089    }
090   
091    @Override
092     public FtpletResult onRmdirStart(FtpSession session, FtpRequest request)
093             throws FtpException, IOException {
094        // TODO Auto-generated method stub
095         return super.onRmdirStart(session, request);
096    }
097   
098    @Override
099     public FtpletResult onRmdirEnd(FtpSession session, FtpRequest request)
100             throws FtpException, IOException {
101        // TODO Auto-generated method stub
102         return super.onRmdirEnd(session, request);
103    }
104   
105    @Override
106     public FtpletResult onMkdirStart(FtpSession session, FtpRequest request)
107             throws FtpException, IOException {
108        // TODO Auto-generated method stub
109         return super.onMkdirStart(session, request);
110    }
111   
112    @Override
113     public FtpletResult onMkdirEnd(FtpSession session, FtpRequest request)
114             throws FtpException, IOException {
115        // TODO Auto-generated method stub
116         return super.onMkdirEnd(session, request);
117    }
118   
119    @Override
120     public FtpletResult onAppendStart(FtpSession session, FtpRequest request)
121             throws FtpException, IOException {
122        // TODO Auto-generated method stub
123         return super.onAppendStart(session, request);
124    }
125   
126    @Override
127     public FtpletResult onAppendEnd(FtpSession session, FtpRequest request)
128             throws FtpException, IOException {
129        // TODO Auto-generated method stub
130         return super.onAppendEnd(session, request);
131    }
132   
133    @Override
134     public FtpletResult onUploadUniqueStart(FtpSession session,
135             FtpRequest request) throws FtpException, IOException {
136        // TODO Auto-generated method stub
137         return super.onUploadUniqueStart(session, request);
138    }
139   
140    @Override
141     public FtpletResult onUploadUniqueEnd(FtpSession session, FtpRequest request)
142             throws FtpException, IOException {
143        // TODO Auto-generated method stub
144         return super.onUploadUniqueEnd(session, request);
145    }
146   
147    @Override
148     public FtpletResult onRenameStart(FtpSession session, FtpRequest request)
149             throws FtpException, IOException {
150        // TODO Auto-generated method stub
151         return super.onRenameStart(session, request);
152    }
153   
154    @Override
155     public FtpletResult onRenameEnd(FtpSession session, FtpRequest request)
156             throws FtpException, IOException {
157        // TODO Auto-generated method stub
158         return super.onRenameEnd(session, request);
159    }
160   
161    @Override
162     public FtpletResult onSite(FtpSession session, FtpRequest request)
163             throws FtpException, IOException {
164        // TODO Auto-generated method stub
165         return super.onSite(session, request);
166    }
167    
168}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值