使用HttpServletResponseWrapper加密接口返回值时如何解决中文乱码问题?

使用HttpServletResponseWrapper加密接口返回值时如何解决中文乱码问题?

使用HttpServletResponseWrapper加密接口返回值及中文乱码解决方案

在开发对外API接口时,数据加密至关重要。本文探讨在Filter中使用HttpServletResponseWrapper加密接口返回值时,如何有效避免中文乱码问题。 核心问题在于如何正确获取响应数据并进行加密处理。

以下代码片段展示了常见的错误尝试:使用CharArrayWriter缓存响应内容,并在flushBuffer方法中进行加密。然而,flushBuffer可能不会被执行,导致加密失败。 尝试在FilterChain.doFilter之后获取数据,则可能出现中文乱码。

HttpServletResponse response = (HttpServletResponse) servletResponse; EncryptResponseWrapper encryptResponseWrapper = new EncryptResponseWrapper(response); encryptResponseWrapper.setCharacterEncoding("UTF-8"); filterChain.doFilter(servletRequest, encryptResponseWrapper);

关键在于EncryptResponseWrapper的实现。改进后的代码如下:

package com.wondersgroup.wdls.js.wapper;  import com.wondersgroup.wdls.js.web.utils.DESUtils;  import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.*;  public class EncryptResponseWrapper extends HttpServletResponseWrapper {     private CharArrayWriter charArrayWriter = null;     private PrintWriter writer = null;     private ServletOutputStream out = null;      public EncryptResponseWrapper(HttpServletResponse response) throws IOException {         super(response);         charArrayWriter = new CharArrayWriter();         out = new WrapperOutputStream(charArrayWriter);         // 关键修改:显式指定UTF-8编码         writer = new PrintWriter(new OutputStreamWriter(new WrapperOutputStream(charArrayWriter), "UTF-8"));     }      @Override     public PrintWriter getWriter() throws IOException {         return writer;     }      @Override     public ServletOutputStream getOutputStream() throws IOException {         return out;     }      public CharArrayWriter getCharArrayWriter() {         return charArrayWriter;     }      @Override     public void flushBuffer() throws IOException {         if (out != null) {             out.flush();         }         if (writer != null) {             writer.flush();         }     }      @Override     public void reset() {         charArrayWriter.reset();     }      public String getResponseData() throws IOException {         flushBuffer();         return charArrayWriter.toString();     }      private class WrapperOutputStream extends ServletOutputStream {         private CharArrayWriter charArrayWriter = null;          public WrapperOutputStream(CharArrayWriter charArrayWriter) {             this.charArrayWriter = charArrayWriter;         }          @Override         public void write(int b) throws IOException {             charArrayWriter.write(b);         }          @Override         public boolean isReady() {             return false;         }          @Override         public void setWriteListener(WriteListener listener) {          }     } }

解决中文乱码的关键在于: 在创建PrintWriter时,通过new OutputStreamWriter(…, “UTF-8”)显式指定UTF-8编码。这确保了写入CharArrayWriter的数据使用正确的编码,避免了后续读取时出现乱码,从而保证了加密操作的正确性和数据的完整性。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享