Apache FtpServer与Spring整合

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

<server xmlns="http://mina.apache.org/ftpserver/spring/v1"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
	   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
	   http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd	
	   "
    id="myServer"
    max-logins="500" 
	anon-enabled="false"
	max-login-failures="20"
	login-failure-delay="30"
    >
  <listeners>
<!-- port为FTP端口默认为21 idle-timeout为登录失效时间单位s-->
        <nio-listener name="default" port="2121" idle-timeout="300">
            <!--<ssl> ssl数据传输加密
                <keystore file="ftpserver.jks" password="password" />
            </ssl>-->
        </nio-listener>
  </listeners>
  <!--FTP操作监听-->
    <ftplets>
			<ftplet name="ftplet1">
	        <beans:bean class="com.agnet.service.FtpService">
  <!--属性注入-->
	          <!--    <beans:property name="foo" value="123" />-->
	        </beans:bean>
	    </ftplet>
	</ftplets>
<!--properties文件存放用户信息
encrypt-passwords 默认为MD5加密,clear为明文密码,salted为加强MD5加密-->
  <!--<file-user-manager file="users.properties" encrypt-passwords="clear"/>-->
  <!-- 数据库存放用户信息
  建表SQL
  CREATE TABLE FTP_USER (      
     userid VARCHAR(64) NOT NULL PRIMARY KEY,       
     userpassword VARCHAR(64),      
     homedirectory VARCHAR(128) NOT NULL,             
     enableflag char(1) DEFAULT 1 check (enableflag in(0,1)),    
     writepermission char(1) DEFAULT 1 check (writepermission in(0,1)),       
     idletime INT DEFAULT 0,             
     uploadrate INT DEFAULT 0,             
     downloadrate INT DEFAULT 0,
     maxloginnumber INT DEFAULT 0,
     maxloginperip INT DEFAULT 0
  );
   -->
    <db-user-manager encrypt-passwords="salted">
	    <data-source>
	        <beans:bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
				<beans:property name="driverClass" value="${common.c3p0.driver}" />
				<beans:property name="jdbcUrl" value="${common.c3p0.url}" />
				<beans:property name="user" value="${common.c3p0.username}" />
				<beans:property name="password" value="${common.c3p0.password}" />
			</beans:bean>
	    </data-source>
  <!--当为数据库存放时 apache FTPserver APi 函数需要调用的sql -->
	    <insert-user>INSERT INTO FTP_USER (userid, userpassword,
	        homedirectory, enableflag, writepermission, idletime, uploadrate,
	        downloadrate,maxloginnumber,maxloginperip) VALUES ('{userid}', '{userpassword}', '{homedirectory}',
	        '{enableflag}', '{writepermission}', {idletime}, {uploadrate},
	        {downloadrate},{maxloginnumber},{maxloginperip})</insert-user>
	    <update-user>
	        UPDATE FTP_USER SET
	            userpassword='{userpassword}',
	            homedirectory='{homedirectory}',
	            enableflag={enableflag},
	            writepermission={writepermission},
	            idletime={idletime},
	            uploadrate={uploadrate},
	            downloadrate={downloadrate},
	            maxloginnumber = {maxloginnumber},
	            maxloginperip = {maxloginperip}
	        WHERE userid='{userid}'
	    </update-user>
	    <delete-user>
	        DELETE FROM FTP_USER WHERE userid = '{userid}'
	    </delete-user>
	    <select-user>
	        SELECT userid, userpassword, homedirectory,
	            enableflag, writepermission, idletime, uploadrate, downloadrate,maxloginnumber,maxloginperip
	        FROM FTP_USER 
	        WHERE userid = '{userid}'
	    </select-user>
	    <select-all-users>
	        SELECT userid FROM FTP_USER ORDER BY userid
	    </select-all-users>
	    <is-admin>
	        SELECT userid 
	        FROM FTP_USER 
	        WHERE userid='{userid}' AND userid='admin'
	        </is-admin>
	    <authenticate>SELECT userpassword from FTP_USER WHERE userid='{userid}'</authenticate>
	</db-user-manager>
</server>

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

Web.xml:

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

MyServletContextListener.java:

public class MyServletContextListener implements ServletContextListener {

    public static final String FTPSERVER_CONTEXT_NAME = "org.apache.ftpserver";
    
    //容器销毁
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Stopping FtpServer");
        //停止FTP server
        FtpServer server = (FtpServer) sce.getServletContext().getAttribute(FTPSERVER_CONTEXT_NAME);
        
        if(server != null) {
            server.stop();
            
            sce.getServletContext().removeAttribute(FTPSERVER_CONTEXT_NAME);
            
            System.out.println("FtpServer stopped");
        } else {
            System.out.println("No running FtpServer found");
        }
        
    }

    //容器初始化
    public void contextInitialized(ServletContextEvent sce) {
        /*在此如不希望容器启动里就开启FTPserver而是希望在页面通过手动开启
System.out.println("Starting FtpServer");   

        WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
        
        FtpServer server = (FtpServer) ctx.getBean("myServer");
        
        sce.getServletContext().setAttribute(FTPSERVER_CONTEXT_NAME, server);
        
        try {
            server.start();
            System.out.println("FtpServer started");
        } catch (Exception e) {
            throw new RuntimeException("Failed to start FtpServer", e);
        }*/    	
    }

}
/**
	 * 开启FTPServer
	 * @param servletContext 可以从action中获得也可以ServletActionContext.getServletContext();
	 */
	public boolean startFtpServer(ServletContext servletContext) {
		System.out.println("Starting FtpServer");   

        boolean flg = true;
        try {
        	FtpServer server = (FtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
	        
	        if(server != null) {
	        	if(server.isSuspended())
	        		server.resume();//恢复
	        	
	        }else{
	        	
	        	WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
	        	
	        	server = (FtpServer) ctx.getBean("myServer");
	        	
	        	servletContext.setAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME, server);
	        	server.start();
	        }
            System.out.println("FtpServer started");
        } catch (Exception e) {
        	flg =  false;
            throw new RuntimeException("Failed to start FtpServer", e);
        }
		return flg;
	}
//由于apache FTPserver不提供重启功能如果需要手动关闭serve可以将其进行挂起,以方便恢复
/**
	 * 关闭FTPServer
	 * @param servletContext
	 * @return
	 */
	public boolean stopFtpServer(ServletContext servletContext) {
		 System.out.println("Stopping FtpServer");
	        
	        FtpServer server = (FtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
	        
	        if(server != null) {
	        	if(!server.isStopped()&&!server.isSuspended())
	        		server.suspend();
	            
	            //servletContext.removeAttribute(FtpServerListener.FTPSERVER_CONTEXT_NAME);
	            
	            System.out.println("FtpServer suspend");
	        } else {
	            System.out.println("No running FtpServer found");
	        }
		return true;
	}
//对用户进行操作
/**
	 * 申请FTP帐号
	 * @param userName
	 * @param sce 
	 * @return
	 * @throws FtpException 
	 */
	public String applyAccount(String userName, ServletContext sce) throws FtpException {
		String psw="";
		//PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
		//File f = new File(AgentFileService.class.getClassLoader().getResource("users.properties").getFile());
		//userManagerFactory.setFile(f);
		//DbUserManagerFactory userManagerFactory = new DbUserManagerFactory();
        //明文密码保存于配置文件中 发面时改为MD5加密 同时修改配置文件applictionContext-ftp
        //userManagerFactory.setPasswordEncryptor(new ClearTextPasswordEncryptor());
        //UserManager um = userManagerFactory.createUserManager();
        DefaultFtpServer server = (DefaultFtpServer) sce.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
        if(server!=null){
        	UserManager um = server.getUserManager();
        	if(um.doesExist(userName)){
        		um.delete(userName);
        	}
        	psw = RandomStringUtils.randomAlphanumeric(8);
        	UserFactory userFact = new UserFactory();
        	userFact.setName(userName);
        	userFact.setPassword(psw);
        	userFact.setHomeDirectory("/home/myftpPath");
        	userFact.setMaxIdleTime(600000);//10分钟无操作自动断开连接
        	List<Authority> alist = new ArrayList<Authority>();
        	Authority a = new WritePermission();//写权限
        	alist.add(a);
        	userFact.setAuthorities(alist);
        	User user = userFact.createUser();
        	um.save(user);
        }
        return psw;
	}

//删除用户

DefaultFtpServer server = (DefaultFtpServer) servletContext.getAttribute(MyServletContextListener.FTPSERVER_CONTEXT_NAME);
			if (server != null) {
				UserManager um = server.getUserManager();
				String[] users = um.getAllUserNames();
				if (users != null && users.length > 0) {
					for (String userName : users) {
						if (!userName.equals(‘admin’)
								&& um.doesExist(userName)) {
							um.delete(userName);
						}
					}
				}
			}

FTP操作监听

FtpService.java:

public class FtpService extends DefaultFtplet{
	@Override
	public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		
		return super.onUploadStart(session, request);
	}

@Override
	public void init(FtpletContext ftpletContext) throws FtpException {
		// TODO Auto-generated method stub
		super.init(ftpletContext);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}

	@Override
	public FtpletResult onConnect(FtpSession session) throws FtpException,
			IOException {
		// TODO Auto-generated method stub
		return super.onConnect(session);
	}

	@Override
	public FtpletResult onDisconnect(FtpSession session) throws FtpException,
			IOException {
		// TODO Auto-generated method stub
		return super.onDisconnect(session);
	}

	@Override
	public FtpletResult beforeCommand(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.beforeCommand(session, request);
	}

	@Override
	public FtpletResult afterCommand(FtpSession session, FtpRequest request,
			FtpReply reply) throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.afterCommand(session, request, reply);
	}

	@Override
	public FtpletResult onLogin(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onLogin(session, request);
	}

	@Override
	public FtpletResult onDeleteStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onDeleteStart(session, request);
	}

	@Override
	public FtpletResult onDeleteEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onDeleteEnd(session, request);
	}

	@Override
	public FtpletResult onUploadStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onUploadStart(session, request);
	}

	@Override
	public FtpletResult onDownloadStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onDownloadStart(session, request);
	}

	@Override
	public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onDownloadEnd(session, request);
	}

	@Override
	public FtpletResult onRmdirStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onRmdirStart(session, request);
	}

	@Override
	public FtpletResult onRmdirEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onRmdirEnd(session, request);
	}

	@Override
	public FtpletResult onMkdirStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onMkdirStart(session, request);
	}

	@Override
	public FtpletResult onMkdirEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onMkdirEnd(session, request);
	}

	@Override
	public FtpletResult onAppendStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onAppendStart(session, request);
	}

	@Override
	public FtpletResult onAppendEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onAppendEnd(session, request);
	}

	@Override
	public FtpletResult onUploadUniqueStart(FtpSession session,
			FtpRequest request) throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onUploadUniqueStart(session, request);
	}

	@Override
	public FtpletResult onUploadUniqueEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onUploadUniqueEnd(session, request);
	}

	@Override
	public FtpletResult onRenameStart(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onRenameStart(session, request);
	}

	@Override
	public FtpletResult onRenameEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onRenameEnd(session, request);
	}

	@Override
	public FtpletResult onSite(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		// TODO Auto-generated method stub
		return super.onSite(session, request);
	}
  	
}


转载于:https://my.oschina.net/laigous/blog/120771

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值