spring系統內路由解決方案

loveindemon發表於2019-05-14

問題描述:

web服務需要實現簡單的API網管功能,通過在欄位中傳入關鍵字,實現對不同介面的訪問,前端只需要維護單個介面的資訊,不需要新增介面時,再去新增新介面的資訊。


實現方案:

首先想到的實現方案是使用重定向或轉發,維護一份關鍵字和介面地址的對映,將對統一介面的訪問,重定向或轉發到對應的具體介面。對於重定向,因為介面的請求方式都是Post,但是重定向會將post請求轉成get請求,無法滿足條件,pass。

然後再來看轉發存在的問題,根據需求,我們需要在入口controller中獲取使用者的傳入的引數,即需要讀取輸入流,而輸入流有一個特性,就是讀取過後就不能再次讀取。轉發是在服務端進行的,不會改變請求物件的內容,但是會消費請求中的輸入流,當再次轉發給具體controller的時候會發現請求體中的內容沒有了,如果你使用了@RequestBody註解就會報Required request body is missing的錯誤。因此需要能快取使用者的請求體。

具體的實現方案就是,自定義一個過濾器,在過濾器中讀取輸入流中的請求體內容,並將request物件替換成自定義的請求物件(繼承HttpServletRequestWrapper),同時重寫request包裝類的getInputStream方法,該方法的主要作用是讀取請求流。因此只要重寫該方法,將快取的請求體作為位元組流供讀取,就可以多次讀取了。程式碼參考了(blog.csdn.net/sdut406/art…)

相關文章