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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章