遇到一個(gè)奇怪的問題论巍,測(cè)試環(huán)境沒有出現(xiàn)烛谊,本地連正式數(shù)據(jù)庫也沒復(fù)現(xiàn)。
主要業(yè)務(wù)邏輯是通過篩選條件從數(shù)據(jù)庫導(dǎo)出一批數(shù)據(jù)嘉汰。異常情況是丹禀,選擇的篩選條件失效了,導(dǎo)致導(dǎo)出了全量數(shù)據(jù),這搞不好會(huì)有數(shù)據(jù)泄露風(fēng)險(xiǎn)双泪。
已知列表分頁查詢是沒有問題的持搜,篩選條件都能生效,代碼如下:
但是導(dǎo)出時(shí)卻沒起作用焙矛,導(dǎo)出代碼:
觀察可知朵诫,他們都調(diào)用的getSqlMap方法,該方法具體作用就是從HttpServletRequest中獲取相關(guān)條件參數(shù)薄扁,并放到Map中,供后續(xù)查詢代碼使用废累,如下:
按常理推斷邓梅,輸入和代碼一致,得到的結(jié)果應(yīng)該是一致的邑滨,但是卻不是這樣
使用jvm神器arthas日缨,watch一下getSqlMap方法,然后分別調(diào)用列表查詢和導(dǎo)出接口掖看,得到如下兩條記錄
對(duì)比可知匣距,上面有的很多參數(shù),下面一條都沒有哎壳,那么參數(shù)怎么會(huì)消失呢毅待?數(shù)據(jù)都是從HttpServletRequest對(duì)象中獲取的,那么這個(gè)對(duì)象里面的數(shù)據(jù)怎么消失了呢归榕?
細(xì)心的網(wǎng)友可能注意到了尸红,我們導(dǎo)出方式是異步的,關(guān)鍵在@Async注解
難道莫非刹泄,HttpServletRequest被回收了外里,果然網(wǎng)上搜一下,很多案例
比較官方的說明特石,不推薦在異步中使用request盅蝗,會(huì)得到不確定的結(jié)果
因此,我們需要在異步方法前提取參數(shù)姆蘸,再傳入
小小的問題墩莫,大大的疑惑∑虻花了不少時(shí)間定位問題贼穆,好在爬出了坑。