關於阿里雲簡訊服務代理的設定問題
阿新 • • 發佈:2018-12-17
在使用阿里雲簡訊服務的時候,由於要將服務設定在內網供其他服務呼叫,這就需要用代理去處理簡訊介面請求,但是阿里官方提供的API就兩個jar包,將http請求的具體細節封裝起來了,樓主為此很是無奈,然後想到有個可以設定全域性代理System.setPropert的方式,這種方式固然可以,但是整合springcloud的eureka之後,發生了非常奇怪的事情,使用代理的時候直接把eureka的心跳給弄死了,瘋狂的報錯。然後無奈之下,去官網找客服,打電話諮詢後竟然說沒有這個東西,然後又到官網問答那兒,有位大神告訴我說可以用彈性網絡卡,但是考慮到具體業務場景,最終沒考慮沒用它。然後又想到一個比較笨的點子,之前看它封裝的Jar裡使用也是HttpURLConnection就想如果直接繼承它裡面的類,在此基礎上修改就好了,可是那裡面很多受保護的類,並不能直接繼承,這時候就想到用最簡單粗暴的方法,將用到的類把原始碼全部拷出來直接修改,大概也就7,8類的樣子,加上代理,然後呼叫的時候就用自己修改的類美滋滋,搞定了,雖然這個方法比較笨,但是最終解決的了問題,也不知道和我遇到同樣問題的大俠是怎麼處理的。。。就是下面這個方法。。
private HttpURLConnection buildHttpConnection(HttpRequest request) throws IOException { Map<String, String> mappedHeaders = request.getHeaders(); String strUrl = request.getUrl(); if (null == strUrl) { throw new IllegalArgumentException("URL is null for HttpRequest."); } if (null == request.getMethod()) { throw new IllegalArgumentException("Method is not set for HttpRequest."); } URL url = null; String[] urlArray = null; if (MethodType.POST.equals(request.getMethod()) && null == request.getHttpContent()) { urlArray = strUrl.split("\\?"); url = new URL(urlArray[0]); } else { url = new URL(strUrl); } System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); HttpURLConnection httpConn = null; //載入通用屬性配置 BasicProperties basic = ApplicationContextUtil.getBean(BasicProperties.class); if (url.getProtocol().equalsIgnoreCase("https")) { if (sslSocketFactory != null) { HttpsURLConnection httpsConn = null; if(basic.isEnable()) { logger.info("==============Https Proxy Mode!"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(basic.getProxyHost(), Integer.parseInt(basic.getProxyPort()))); httpsConn = (HttpsURLConnection)url.openConnection(proxy); }else { logger.info("==============Https Direct Mode!"); httpsConn = (HttpsURLConnection)url.openConnection(); } httpsConn.setSSLSocketFactory(sslSocketFactory); httpConn = httpsConn; } } if (httpConn == null) { if(basic.isEnable()) { logger.info("==============HTTP Proxy Mode!"); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(basic.getProxyHost(), Integer.parseInt(basic.getProxyPort()))); httpConn = (HttpURLConnection)url.openConnection(proxy); }else{ logger.info("==============HTTP Direct Mode!"); httpConn = (HttpURLConnection)url.openConnection(); } } httpConn.setRequestMethod(request.getMethod().toString()); httpConn.setDoOutput(true); httpConn.setDoInput(true); httpConn.setUseCaches(false); //自定義超時設定 httpConn.setConnectTimeout(new Integer(basic.getConnectTimeOut())); httpConn.setReadTimeout(new Integer(basic.getReadTimeOut())); if (request.getConnectTimeout() != null) { httpConn.setConnectTimeout(request.getConnectTimeout()); } if (request.getReadTimeout() != null) { httpConn.setReadTimeout(request.getReadTimeout()); } httpConn.setRequestProperty(ACCEPT_ENCODING, "identity"); for (Entry<String, String> entry : mappedHeaders.entrySet()) { httpConn.setRequestProperty(entry.getKey(), entry.getValue()); } if (null != request.getHeaderValue(CONTENT_TYPE)) { httpConn.setRequestProperty(CONTENT_TYPE, request.getHeaderValue(CONTENT_TYPE)); } else { String contentTypeValue = request.getContentTypeValue(request.getHttpContentType(), request.getEncoding()); if (null != contentTypeValue) { httpConn.setRequestProperty(CONTENT_TYPE, contentTypeValue); } } if (MethodType.POST.equals(request.getMethod()) && null != urlArray && urlArray.length == 2) { httpConn.getOutputStream().write(urlArray[1].getBytes()); } return httpConn; }