最近在關注微博開發平台,前幾日在騰訊微博開放平台創建了一個應用,中途越到了些問題:
1、關於Oauth授權,第一次接觸的時候,也暈了很久,一下子接觸了很多新東西,要慢慢消化,不過到最後也都還消化的不錯。主要有urlencode、basestring、signature、base64encode等。
2、聯網。之前一直沒有嘗試使用過聯網,這些一來就悶在哪裡。URL、URLConnction、HttpURLConnection、HttpClient、HttpPost、HttpGet。還好騰訊在授權的時候支持Get方式,相對新浪和網易,此處較為簡單。
3、發布微博中文亂碼。這個主要是創建應用的時候就沒有選好編碼,中間編程的時候代碼考來考去導致的。
下面介紹的是一個無關微博問題,不過這個問題是在微博開發中遇到的。
前天,騰訊微博服務器調試出現了小狀況,很多原本可以正常授權的應用都變成無法授權。個人也剛好調試到此問題,因為之前調試過均正常,也不敢貿然說服務器有問題,仔細檢查了一遍又一遍的代碼,將調試結果輸出顯示,並對照參考上網搜索,而後大概知道是遇到了服務器SSL證書無效。此後,不時的有開發者也在qq群中反饋問題,可以肯定是服務器的問題了。
那麼,遇到服務器SSL證書無效會出現哪些異常?有如何處理?
正常情況下,如果SSL證書無效,那麼java會拋出SSLException。在Oauth授權的時候,如果碰到SSLException異常,我們就無法獲取oauth_token和oauth_token_secret了。
解決方法很簡單:那就是直接信任所有的證書,而不去檢查證書的有效性。下面有個網上提供的類,使用的時候只要在聯網前調用該類的allowAllSSL()函數即可。
- public class _FakeX509TrustManager implements X509TrustManager {
-
- private static TrustManager[] trustManagers;
- private static final X509Certificate[] _AcceptedIssuers = new
- X509Certificate[] {};
-
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String
- authType) throws CertificateException {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String
- authType) throws CertificateException {
- }
-
- public boolean isClientTrusted(X509Certificate[] chain) {
- return true;
- }
-
- public boolean isServerTrusted(X509Certificate[] chain) {
- return true;
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return _AcceptedIssuers;
- }
-
- public static void allowAllSSL() {
- HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
-
- @Override
- public boolean verify(String arg0, SSLSession arg1) {
- // TODO Auto-generated method stub
- return true;
- }
-
- });
-
- SSLContext context = null;
- if (trustManagers == null) {
- trustManagers = new TrustManager[] { new _FakeX509TrustManager() };
- }
-
- try {
- context = SSLContext.getInstance("TLS");
- context.init(null, trustManagers, new SecureRandom());
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (KeyManagementException e) {
- e.printStackTrace();
- }
-
- HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
- }
-
- }
使用實例:
_FakeX509TrustManager.allowAllSSL();//調用
URL postUrl = new URL("https://open.t.qq.com/cgi-bin/request_token?"+params);
URL postUrl = new URL("http://www.linuxidc.com");
HttpURLConnection con = (HttpURLConnection) postUrl.openConnection();