一、前言
在上上一篇中,博主基于开源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