Spring OAuth2RestTemplate getForEntity 中文亂碼解決方法
Spring OAuth2RestTemplate getForEntity 中文亂碼解決方法
最近在除錯微信支付,遇到蠻多的坑,不過還好網上大多都有對應的解決方案,還算比較順利地對接好了!這裡記錄一個和微信支付過程無關的坑,也是很少人提到的。這個BUG最開始出現是由於我將微信賬號從測試號換為了正式的公眾號資訊,這也就導致之前的所有測試使用者都要重新關注微信,並且也會重新生成對應的OpenID和使用者資訊。然後呢,這時候發現只有我一個人的微信賬號可以正常進入測試系統,而其他同事的微信賬號都無法進入測試系統,並且都陷入無限迴圈重新整理的情況中。即使將資料庫中資料清空,將微信快取清理掉,仍然是我可以正常進入系統,而其他同事都不行。實在是很費解!最後實在是沒有辦法,只能在本地進行跟蹤除錯,這才發現新建使用者的介面出現了400
的錯誤,裡面提示有UTF_8
的編碼錯誤。然後再和同事們的微信賬號一對比,發現我的微信暱稱是拼音,而其他人都是中文,所以這也是我能夠正常進入系統的原因。接下來就是解決這個UTF_8
的編碼錯誤:
最開始我搜尋OAuth2RestTemplate
、getForEntity
、utf-8
相關的關鍵詞的時候,發現並沒有什麼參考資料,後來再跟進原始碼裡面看到public class OAuth2RestTemplate extends RestTemplate implements OAuth2RestOperations
,而RestTemplate
裡面有HttpMessageConverter
,這是專門用來做HTTP Request
和HTTP Response
的轉換的。設定斷點跟了一下,果然發現StringHttpMessageConverter
的預設字符集不是UTF_8
,而是ISO-8859-1
,那麼接下來覆蓋掉裡面的預設編碼字符集應該就可以解決問題了!
下面是程式碼:
//sso filter
private 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;
}
果不其然,其他同事也可以正常訪問測試系統了。
上面這段程式碼是在整合微信的OAuth
和Spring Security
,感興趣的同學可以去我們團隊的Github部落格上看看整個工程的原始碼。
為什麼我不一開始就直接本地除錯呢?因為應用微服務架構後,發現本地除錯比較麻煩,或者說我們還沒有發現比較方便的本地/遠端除錯方法!當然啦,Spring Cloud
框架已經提供了一個Remote Debug
這樣的東西,但是還沒空去研究啊。藉此吐槽小團隊要實踐微服務架構真是很大的挑戰!就目前這款產品的開發進度來看,至少有一個月以上的時間是花在了探索微服務架構的相關技術上面去了,這一個月對於一款新的網際網路產品來說真的是非常寶貴的。話不多說,我得去加班了:)
相關文章
- Spring MVC 中文編碼亂碼解決SpringMVC
- centos7 vim中文亂碼解決方法CentOS
- toad 中文顯示亂碼解決方法
- 讀mysql中文亂碼問題解決方法MySql
- Windows控制檯(cmd)中文亂碼解決方法Windows
- CentOS中文亂碼問題的解決方法CentOS
- RHEL中文亂碼解決
- HttpClient 解決中文亂碼HTTPclient
- matplotlib 圖示 中文亂碼, 與 wordcloud 詞雲圖 中文亂碼 解決方法Cloud
- sqlldr 匯入中文出現亂碼解決方法SQL
- ISAPI_Rewrite中文變亂碼的解決方法API
- DEBIAN 5.02 SSH 中文亂碼解決方法
- spring mvc中關於url中傳遞中文亂碼的解決方法SpringMVC
- request/response解決中文亂碼
- eclipse中文亂碼解決Eclipse
- myeclipse解決中文亂碼Eclipse
- 解決Linux中文亂碼Linux
- ROS中解決中文亂碼ROS
- 解決中文亂碼問題
- 解決MySQL中文亂碼和插入中文不顯示的方法MySql
- 解決Spring中ResponseBody返回中文亂碼問題Spring
- javaweb中中文亂碼解決方法總結之response和request解決方法JavaWeb
- git操作時中文顯示亂碼的解決方法Git
- Mysql中文亂碼問題的最佳解決方法MySql
- IDEA控制檯輸出中文亂碼解決方法Idea
- Linux中文亂碼問題終極解決方法Linux
- Mac下navicat for mysql中文顯示亂碼解決方法MacMySql
- Linux下解決matplotlib中文亂碼的方法Linux
- MySql中文亂碼問題解決MySql
- Jmeter 解決中文亂碼問題JMeter
- 解決 SecureCRT 和 SecureFX 中文亂碼Securecrt
- Java 解決中文亂碼問題Java
- RDSSQLSERVER解決中文亂碼問題SQLServer
- Windows下Clion中文亂碼解決Windows
- 徹底解決Oracle中文亂碼Oracle
- 解決MySQL中文亂碼問題MySql
- Node.js 中文亂碼解決Node.js
- 解決SecureCRT中文顯示亂碼Securecrt