spring boot中支付宝生活号事件订阅,中文参数乱码问题解决方案

项目使用的是spring boot 2.0.0 RELEASE版本

出发点:

在支付宝生活号后台设置好支付宝默认应用网关之后,只要有关注、取关等等事件之后都会发推送过来。

看样子默认是GBK编码,得验签返回。

问题:

当接收到签名后发现中文乱码(项目默认request编码是UTF-8)

1、String biz_content = request.getParameter("biz_content");
2、String str1= new String(biz_content.getBytes("GBK"), "utf-8");
3、String str= new String(biz_content.getBytes("ISO-8859-1"), "utf-8");

使用1、2、3等方式都乱码

使用方式4:在request.getParamter之前

request.setCharacterEncoding("GBK");

还是乱码

使用方式5:在RequestMapping添加

produces ="text/plain;charset=GBK"

还是乱码

=====================================以上都乱码================================================

尝试着到支付宝论坛寻找问题,也是无果,询问了一下阿里的技术客服,也是建议整个项目设置为GBK编码,无奈只能自己来了

====================================以下为分析过程===============================================

由于spring boot只是集成mvc部分,实际上还是spring mvc,研究过springmvc部分原理机制的同学应该知道,spring mvc会使用CharacterEncodingFilter 对字符做编码,在下图代码打断点,可以发现项目默认编码是用UTF-8,并且设置了CharacterEncoding,看样子问题就在这里了

spring boot默认加载在之前的文章说过,这里不多说

通过上面的图,可以看出springmvc所有request的配置是通过 

spring.http.encoding

至此,我们发现刚才doFilterInternal可以设置的内容,一个是charset,一个force-request。于是通过设置

spring.http.encoding.charset=GBK

问题解决

通过设置(Whether to force the encoding to the configured charset on HTTP requests)

spring.http.encoding.force-request=false

问题解决

================================================================================================

在这里问题又来了,如果我们通过设置charset解决这个问题,后续可能会出现什么现象?

使用force-request解决这个问题,后续又可能会出现什么现象?

欢迎留言指点,谢谢

猜你喜欢

转载自blog.csdn.net/qq_26093341/article/details/82192483
今日推荐