SpringBoot定时器+文件Md5码实现文件变动检测

一、前言

 

        在上上一篇中,博主基于开源truelicense组件,写了一个demo放到了github上,传送门,里面的功能主要有三个:

     (1)creator模块:通过秘钥对+参数生成证书lic文件

     (2)基于lic文件进行证书安装

     (3)verify模块:结合系统应用对证书中的参数进行解析,并通过数值比较来决定系统是否可用;

              a.如系统可用期限是否到期,

              b.如系统当前注册的人数是否超过了证书中规定的最大用户数量

              c.如系统部署的机子ip和mac地址是否在证书圈定的数值内等

           在本篇中,我将再一次以license为例(不过本篇的lic例子是假的,模拟出来的,主要为了便捷的表达最终的效果),来讲述一下如何动态的给用户提供lic文件,而不用重启整个服务重新再安装一遍证书

 


 

二、场景

 

        软件证书license是有偿软件或业务系统必不可少的一道门槛,如果你想对自己的产品加以使用限制,那么拥有一个lic文件是一件很有必要的事情,至于实现方式,有很多种,至于限制方式,也有很多,天马行空,只要你敢想!

        我这个人有个习惯,写博客撸代码,一定要结合业务场景来,我不会为了纯粹写代码而更博客,那样我就机械般的复制粘贴好了;但那会让我觉得更一篇博文是没有任何感情色彩的,反而会让我觉得反感,还不如不更!

        昨天,配合测试人员把lic的功能走了一遍,其实功能不复杂,就是在一台机子上一键部署我们的xx产品,然后带lic的那种,限制用户的使用,比如登录的时候验证下有效期、注册的时候验证一下是否超过了最大用户数量;在这里,博主要啰嗦一句了,因为这个真的很重要,很重要,很重要:写代码一定要有灵魂和远见性,能做成jar包通用组件的就扔到maven仓库里,不要功能大杂烩,该拆的拆,该提的提,该分支维护的分支维护,一定要让一个jar包充分发挥它自身的价值!

        扯回来,虽然lic功能是ok的,但是测试过程发现一个问题,每一次重新生成lic文件,我们的测试人员都要重启一把产品才能使新的lic重新安装生效。我就去了,这就很恶心了,用户又不关心tomcat是什么对吧,用户只需要覆盖lic就行,管它后台程序是不是重新读取安装呢,怎么办?好办,加个定时器,读秒的那种去读lic文件的md5串,只要文件变动,md5必然改变,基于md5的前后比较,来自动实现证书的重新安装,ok,就是这么easy,下面走代码,实现一波!

 

 


 

 

三、项目结构       

 

      

主要代码片段如下:

 

@Autowired
    private LicenseInstall licenseInstall;

    @Value("${gx.license.file.path}")
    private String licPath;

    /**文件唯一身份标识 == 相当于人类的指纹一样*/
    private static String md5 = "";

    /**5秒检测一次,不能太快也不能太慢,自己体会*/
    @Scheduled(cron = "0/5 * * * * ?")
    protected void timer() throws Exception {
        String readMd5 = FileUtils.getMd5(licPath);
        if(FileTimer.md5 == null || "".equals(FileTimer.md5)){
            FileTimer.md5 =readMd5;
        }
        // 不相等,说明lic变化了
        if(!readMd5.equals(FileTimer.md5)){
            LoggerHelper.info("========证书安装开始========");
            licenseInstall.install(licPath);
            LoggerHelper.info("========证书安装结束========");
            FileTimer.md5 = readMd5;
        }
    }

 

瞅一眼,SysConfig和LicenseParam的定义:

 

 

 

 

再看一眼lic.txt的内容(注意,内容是模拟的,正常来说是加密的字节):

 

{
   "issuedTime":"2019-11-01 08:00:00",
   "expiryTime":"2019-11-05 08:00:00",
   "maxUsers":10
}

 

最后来一眼,文件的md5指纹串(我就这么称呼了啊,比较直白好懂)是如何获取的:

 

 

ok,万事俱备,只欠东风,准备测试一波!文末demo会放到github上,供参考!

 


 

 

四、License文件变动测试

 

(1)启动项目

 

 

Tomcat started on port(s): 8081 (http) with context path ''

 

启动的很平静,因为我们设置的定时器检测的是lic文件的变动,第一次启动项目时,是先初始化md5值,因此不会有输出。

 


 

(2)我们修改一下lic中的过期时间,我们往前调一下

 

 

       只要你保存,定时器会如约的(5s一次)检测到lic文件内容的变动,从而触发lic的重新安装,由于过期时间比当前时间还要前,所以证书安装是失败的:

 

   


     

     所以,我们会在控制台看到如下异常输出:

 

 


 

(3)我们正常一点,把时间改大一点,改到2020-11-03号,同时把最大用户数的10改成3(注意系统当前最大用户是5

 

 

 


 

(4)我们调一下接口验证下证书的用户人数限制是否起作用了

 

 


 

 


 

 

五、GitHub地址

 

地址:https://github.com/kobeyk/file-changing

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值