使用HttpServletResponseWrapper加密接口返回值时如何解决中文乱码和内容获取不完整问题?

使用HttpServletResponseWrapper加密接口返回值时如何解决中文乱码和内容获取不完整问题?

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
喜欢就支持一下吧
点赞13 分享