首页 > 文章列表 > HttpServletResponseWrapper加密接口返回值时如何避免中文乱码?

HttpServletResponseWrapper加密接口返回值时如何避免中文乱码?

318 2025-04-12

HttpServletResponseWrapper加密接口返回值时如何避免中文乱码?

使用HttpServletResponseWrapper加密接口返回值,避免中文乱码

在开发对外API时,数据安全至关重要,常常需要对返回数据进行加密。一种常见的做法是使用Filter拦截请求,并通过自定义HttpServletResponseWrapper包装响应对象,在数据输出前进行加密。然而,这过程中容易出现获取响应内容失败或中文乱码问题。本文将解决“自定义Filter,使用HttpServletResponseWrapper加密返回值,无法获取内容或出现乱码”的问题。

问题核心在于如何正确获取并加密响应内容,并避免中文乱码。直接使用flushBuffer()方法通常无效,而使用CharArrayWriter获取内容时,可能出现中文乱码。

根本原因在于HttpServletResponseWrappergetWriter()方法返回的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加密接口返回值时出现的编码问题,确保返回的加密数据正确且无乱码。

来源:1741430259