小明是一名搬磚人員,他正在開發一個需要用戶權限的接口,有一個攔截器(AuthInterceptor)去控制用戶登錄狀態,小明每次清除cookie後去調用方法都需要重新登錄,覺得非常的麻煩。如果你去重寫這個AuthInterceptor成MockAuthInterceptor如下代碼:
並且修改AuthInterceptor的注入方式
就可以做到本地用戶不需要登錄就能完成用戶注入了。
但是小明發現他的搬磚隊友得用他自己的用戶信息,此時他本地就要修改用戶的信息,但是他提交代碼的時候不小心提交上去了,導致小明用的時候數據一直不對,排查了很久。當然聰明的小夥伴能想到這麼一種做法,使用springboot的啓動參數,去調整本地配置
此時MockAuthInterceptor被修改成了下面的樣子
並且設置spring啓動項
每個搬磚工都這麼操作後,就可以完成每次應用的請求用戶都是自己。
以上確實能解決上面的問題了,如果除開Mock的攔截器外可以說開發者完全可以避開代碼提交時候恢復代碼的麻煩和接口登陸的問題,但是你可能是一個標準的web項目,沒有boot,這咋整啊,樓主就是這麼一個情況,下面說一個巧妙的方法去規避上面的情況,那就是使用斷點。
衆所周知斷點是調試器讓程序可以在某個代碼的地方停頓,idea在斷點的情況下允許使用表達式進行及時代碼運行。比如,剛剛的AuthInterceptor就可以這麼操作,點打個斷點在user判斷的地方,如下
此時可以右鍵選擇表達式
點擊這裏成多行表達式
輸入下面內容並且執行
此時能發現user已經有數據了,斷點執行後是可以到達controller而不是返回。我們可以發現,這個表達式是可以動態的修改我們的數據的。平時debug的時候也經常用這種方式進行調試代碼變成自己想要的情況。
但是我們發現個問題,如果每次請求都要自己執行以下這個代碼,是不是非常的麻煩?
接下來我們來介紹一個新的斷點---條件斷點。
我們右鍵剛剛打的斷點發現
這裏有個條件可以輸入,這個條件表達式的結果必須是boolean類型(不然怎麼叫條件),我常用這個斷點去斷一些情況很多但只有某種情況下的代碼。比如你調試循環的時候
上面是spring初始化單例bean的處理方法,這時有一堆的bean會被創建,但是我想看看我的UserService是怎麼創建的則可以右鍵斷點寫上表達式
此時斷在這裏的肯定是bean名字爲UserService,應該就是我的那個bean了,後面跟就完事了。
上面是條件斷點的運用,我們發現其實它會類似於表達式一樣運行並且判斷斷點的結果去斷程序,聰明的小夥伴應該已經有一點想法了。
那我來說說怎麼實現我一開始說的小明那個希望每次不用登錄而且不用擔心開發者提交了自己的信息吧。
右鍵剛剛AuthInterceptor的斷點
寫入下面內容
記得打開多行輸入,此時就是他會自動執行用戶注入,無任何代碼侵入瞭解決方案了,但是要注意要開啓斷點,關閉斷點是不會走任何表達式的。
這個方案除了不能類似於git那樣的共享外都非常的使用!