前言
很久沒寫博客了,csdn都開始ai潤色了,之前都是看相應框架的源碼看了個遍,感覺底層原理都差不多,這陣子著手改造了下gateway中的白名單,之前白名單存儲到nacos,要改成存到數據庫。里面涉及到淺淺的源碼原理,由于之前看過Spring源碼,整個流程幾分鐘就debug完了,體會到了看源碼的好處了,也就是后置處理器的選擇上。也記錄一下。
需求
公司的nacos部署在公網,被惡意攻擊了,白名單配置信息放到nacos上不安全,所以要改造一下gateway
改造原理
項目基于sa-token進行認證,找到nacos上的白名單key:security.ignore.whites 去代碼上全局搜一下,很容易找到gateway中的認證核心邏輯代碼位置,定位到在SaReactorFilter里面會對path進行認證,改成讀取db緩存中的白名單即可,由于項目中RedisTemplate的key序列化器沒用字符串序列化器,我這臨時替換還原了一下。
難點
項目中用到了:數據庫sql自動升級任務。是基于@PostConstruct實現的,且沒有指定bean order順序。不好改別人的代碼,指定order順序順序執行bean方法的方案pass
我這邊的sql腳本在項目啟動的時候會被自動創建
表創建好了,db數據也有了,項目啟動的時候還要干一件事,就是把db中的數據丟到緩存里面,這里涉及到一個bean的加載順序。加載db的數據到緩存,要在sql升級任務后執行
開始debug源碼
之前看過@PostConstruct的執行時間,但是有點忘記了,直接在@PostConstruct方法里面打個斷點,看一下執行的棧幀
定位到是在applyBeanPostProcessorsBeforeInitialization這個前置處理器處理的@PostConstruct,然后發現還有個applyBeanPostProcessorsAfterInitialization在@PostConstruct后執行
發現直接用的頂層后置處理器BeanPostProcessor
當時有點糾結要用哪個后置處理器,去實現這個需求,對照名字看了一圈沒找到合適的
最后基于最原始的BeanPostProcessor實現一下就好了