HttpServletResponseWrapper加密接口返回值:解決中文亂碼和內容缺失
開發對外開放接口時,數據加密至關重要。本文分析使用HttpServletResponseWrapper在過濾器中攔截請求并加密返回值時遇到的中文亂碼和響應內容不完整問題,并提供解決方案。
核心問題:自定義HttpServletResponseWrapper攔截并加密接口返回數據時,無法完整獲取響應內容進行加密,即使獲取到內容也可能出現中文亂碼。
嘗試方案及問題:
- 方案一:使用CharArrayWriter存儲響應內容,在flushBuffer()方法中加密。 問題:flushBuffer()方法未執行,因為響應內容在FilterChain.doFilter()之后寫入,而flushBuffer()在之前調用。
- 方案二:嘗試先獲取響應內容再加密。 問題:doFilter()之后的代碼無法執行,無法獲取完整內容。使用CharArrayWriter雖然能獲取內容,但出現中文亂碼,即使設置UTF-8編碼也無效。
根本原因:HttpServletResponseWrapper的getWriter()方法實現問題。自定義的EncryptResponseWrapper類中,PrintWriter的構造方法未正確指定編碼。
解決方案:
確保PrintWriter的構造函數使用正確的編碼:
writer = new PrintWriter(new OutputStreamWriter(new WrapperOutputStream(charArrayWriter), "UTF-8"));
通過顯式指定UTF-8編碼,確保寫入CharArrayWriter的內容使用UTF-8編碼,避免亂碼。同時,需確保WrapperOutputStream正確將數據寫入CharArrayWriter。 此修改后,即可獲取完整且編碼正確的響應內容,再進行加密處理。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END