经过几年的开发,突然发现到现在自己只涨年限,不涨经验。回想其中缘故:
应了一句老话:黑瞎子掰棒子,掰了一路丢了一路;所以最终也没有剩下什么。
对自己狠狠心,不要太懒就好,当完成一次觉得耗时的且有价值的任务的时候,在每天结束的时候,将其记录下来。记录的过程也是对问题再次理解的过程,书者没有怎么写过文章,有不当之处,希望大家指正;
最近开发的系统,有这么一个需求:项目中需要引用geoserver发布的地图,但是因为系统使用者的问题,需要分权限来做。跟前台做地图的开发人员沟通之后,发现不同通过sld_body的方式来做,一是sld_body的数据量比较大,而且这样做起来效率也不是很高;后来想了一个办法通过动态修改geoserver项目目录下的styles样式文件来生成拥有不同权限的样式文件;这样每次wms请求style样式文件的时候就可以调用不同权限下的数据了。因为考虑到geoserver和自己的系统可能不在同一台电脑上,所以通过ftp来远程操作文件。
因为之前一直没有用过FTP在java中调用远程文件,所以在网上找了些资料,经过一番翻找,发现Apache的FTPClient工具是比较成熟,且稳定的ftp工具。遂在网上找了一个现成的工具类。放在项目中测试,没有问题。因为开发过程中测试只能通过本机或者局域网测试,所以导致测试不全面。当项目部署到服务器之后,用FTPClient的工具类调用远程服务器的文件进行操作的时候,就出现了问题。
首先ftp的远程登录是没有问题的,完全可以登录。但是当我向远程服务器提交删除文件的命令的时候,出现了 500 Invalid PORT Command的错误,在网上查询发现是因为ftp的主动和被动请求的机制的问题。在网上找了一通,并没有发现很有价值且值得参考的文章,所以我就只好通过FTPClient的官方API入手,看是否有价值的提示,在API中的一个常亮的解释中,发现了一丝端倪,API解释如下:
PASSIVE_LOCAL_DATA_CONNECTION_MODE
该常量的设置是通过下面这个方法实现的:
enterLocalPassiveMode
最后,在每个执行相关fpt操作的方法前我都调用了此方法,完美解决问题。问题最终解决是通过这么一个原理:既然主动不好使,那么只能通过被动请求咯。
虽然上面的解释有些牵强,但是,问题能得到解决还是很开心,特此记录。
但是通过ftp方位远程服务器,操作文件非常耗时,不知道是我同时操作的文件量多还是,所有ftp操作都是如此,如果有此方面经验的同仁,希望不吝赐教。