問題需求
現在需要對所有使用者的輸入資料請求進行處理,要求使用者請求資料的資料不含有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中的資料
工具類
測試測試字串:
執行截圖: