使用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