使用HttpServletResponseWrapper加密接口返回值,避免中文亂碼
在開發對外API時,數據安全至關重要,常常需要對返回數據進行加密。一種常見的做法是使用Filter攔截請求,并通過自定義HttpServletResponseWrapper包裝響應對象,在數據輸出前進行加密。然而,這過程中容易出現獲取響應內容失敗或中文亂碼問題。本文將解決“自定義Filter,使用HttpServletResponseWrapper加密返回值,無法獲取內容或出現亂碼”的問題。
問題核心在于如何正確獲取并加密響應內容,并避免中文亂碼。直接使用flushBuffer()方法通常無效,而使用CharArrayWriter獲取內容時,可能出現中文亂碼。
根本原因在于HttpServletResponseWrapper的getWriter()方法返回的PrintWriter對象。原代碼中,PrintWriter的構造函數未指定編碼方式,導致默認編碼與實際應用編碼不一致,從而產生亂碼。
解決方案:
關鍵在于創建PrintWriter對象時,顯式指定UTF-8編碼。修改后的代碼如下:
writer = new PrintWriter(new OutputStreamWriter(new WapperOutputStream(charArrayWriter), "UTF-8"));
通過在OutputStreamWriter構造函數中指定”UTF-8″編碼,CharArrayWriter將使用UTF-8編碼存儲字符,避免中文亂碼。此修改直接作用于EncryptResponseWrapper類的構造函數中PrintWriter對象的創建過程。
此外,確保DesUtils.getEncryptString(content)方法也正確處理UTF-8編碼的字符串,否則加密后的內容仍然可能出現亂碼。
通過以上修改,可以有效解決使用HttpServletResponseWrapper加密接口返回值時出現的編碼問題,確保返回的加密數據正確且無亂碼。