首頁>技術>

問題需求

現在需要對所有使用者的輸入資料請求進行處理,要求使用者請求資料的資料不含有html的標籤。對於該問題首先我們可以寫一個filter過濾器,取出request中的資料,請求資料包括param和body的形式,也就是字串拼接或者放在請求體中。取出資料後,再進行正則表示式校驗就可以了。

出現的問題

思路就是這樣,在寫的過程中,但是由於我們從request中呼叫了getInputStream(),這樣會導致,在controller層,我們使用@RequestBody註解獲取資料時,出現getInputStream() has already been called for this request異常。因為request中的getRead() 和 getInputStream()在讀取一次後標記為-1,無法再次被讀取,而在@RequestBody在ServletServerHttpRequest中,也呼叫了getInputStream()方法所以如果資料在filter中被讀取,將無法在@RequestBody中再次讀取。當然如果傳輸的引數中存在檔案,仍然會有getInputStream() has already been called for this request異常,這個時候可以將自己檔案上傳的url過濾掉。

解決方法

我們設定一個私有變數用於儲存原始request的body資料或者param資料,並重寫getReader()和getInputStream()方法,這樣我們在filter處理了body資料,又能在controller中用@RequestBody中獲取到資料了此時解決方案,將request進行包裝(裝飾者模式),並重寫getInputStream()和getRead()方法。

最後程式碼

Filter類

獲取body中的資料

獲取param中的資料

工具類

測試

測試字串:

執行截圖:

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 字串令牌解析