1. 程式人生 > >關於阿里雲簡訊服務代理的設定問題

關於阿里雲簡訊服務代理的設定問題

在使用阿里雲簡訊服務的時候,由於要將服務設定在內網供其他服務呼叫,這就需要用代理去處理簡訊介面請求,但是阿里官方提供的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;
    }