项目使用的是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解决这个问题,后续又可能会出现什么现象?
欢迎留言指点,谢谢