Spring OAuth2RestTemplate getForEntity 中文乱码解决方法

来源:互联网 发布:java上传文件到服务器 编辑:程序博客网 时间:2024/06/06 05:27

Spring OAuth2RestTemplate getForEntity 中文乱码解决方法

最近在调试微信支付,遇到蛮多的坑,不过还好网上大多都有对应的解决方案,还算比较顺利地对接好了!这里记录一个和微信支付过程无关的坑,也是很少人提到的。这个BUG最开始出现是由于我将微信账号从测试号换为了正式的公众号信息,这也就导致之前的所有测试用户都要重新关注微信,并且也会重新生成对应的OpenID和用户信息。然后呢,这时候发现只有我一个人的微信账号可以正常进入测试系统,而其他同事的微信账号都无法进入测试系统,并且都陷入无限循环刷新的情况中。即使将数据库中数据清空,将微信缓存清理掉,仍然是我可以正常进入系统,而其他同事都不行。实在是很费解!最后实在是没有办法,只能在本地进行跟踪调试,这才发现新建用户的接口出现了400的错误,里面提示有UTF_8的编码错误。然后再和同事们的微信账号一对比,发现我的微信昵称是拼音,而其他人都是中文,所以这也是我能够正常进入系统的原因。接下来就是解决这个UTF_8的编码错误:

最开始我搜索OAuth2RestTemplategetForEntityutf-8相关的关键词的时候,发现并没有什么参考资料,后来再跟进源码里面看到public class OAuth2RestTemplate extends RestTemplate implements OAuth2RestOperations,而RestTemplate里面有HttpMessageConverter,这是专门用来做HTTP RequestHTTP Response的转换的。设置断点跟了一下,果然发现StringHttpMessageConverter的默认字符集不是UTF_8,而是ISO-8859-1,那么接下来覆盖掉里面的默认编码字符集应该就可以解决问题了!
下面是代码:

//sso filterprivate Filter ssoFilter(ClientResources client, String path) {    OAuth2ClientAuthenticationProcessingFilter filter = new WeChatOAuth2ClientAuthenticationProcessingFilter(path);    OAuth2RestTemplate template = new WeChatOAuth2RestTemplate(client.getClient(), oauth2ClientContext);    //StringHttpMessageConverter的默认字符集是'ISO-8859-1',会导致中文乱码,因此手动设置为'UTF_8'    List<HttpMessageConverter<?>> converterList = template.getMessageConverters();    HttpMessageConverter<?> converterTarget = null;    for(HttpMessageConverter<?> item : converterList){        if(item.getClass() == StringHttpMessageConverter.class){            converterTarget = item;            break;        }    }    if(converterTarget != null){        converterList.remove(converterTarget);    }    HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);    converterList.add(converter);    filter.setRestTemplate(template);    UserInfoTokenServices tokenServices = new WeChatUserInfoTokenServices(client.getResource().getUserInfoUri(), client.getClient().getClientId(), userLocalService);    tokenServices.setRestTemplate(template);    filter.setTokenServices(tokenServices);    return filter;}

果不其然,其他同事也可以正常访问测试系统了。

上面这段代码是在整合微信的OAuthSpring Security,感兴趣的同学可以去我们团队的Github博客上看看整个工程的源码。

为什么我不一开始就直接本地调试呢?因为应用微服务架构后,发现本地调试比较麻烦,或者说我们还没有发现比较方便的本地/远程调试方法!当然啦,Spring Cloud框架已经提供了一个Remote Debug这样的东西,但是还没空去研究啊。借此吐槽小团队要实践微服务架构真是很大的挑战!就目前这款产品的开发进度来看,至少有一个月以上的时间是花在了探索微服务架构的相关技术上面去了,这一个月对于一款新的互联网产品来说真的是非常宝贵的。话不多说,我得去加班了:)

1 0
原创粉丝点击