HttpURLConnection System.setProperty全局代理遇到的一个坑

一)背景

今天在项目中遇到一个HttpURLConnection System.setProperty设置全局代理的坑。

项目需求:公司需要开发一个企业微信单点登录的功能,会涉及到调用微信的相关接口,如果微信认证OK,再调用公司内部另一个系统的接口,获取一些用户相关权限,微信和内部权限都获取到之后就跳转到系统首页进行其它操作。

 

项目流程:在微信中加一个菜单入口-->从微信点击菜单-->调用微信相关认证接口-->调用公司内部其它项目接口-->认证OK,跳转到公司系统首页界面。

 

坑的原因:由于项目部署在公司内网服务器,在访问微信接口的时候需要通过代理方式进行外网接口请求,而内部接口不需要代理就可以请求(代理请求会报错),因为第一步先通过微信访问,先访问的时候就通过System.setProperty设置了全局代理,在微信接口验证成功之后,再访问公司内部接口就一直返回null。

为啥说是坑:因为以前做过纯微信接口访问功能,所以就设置了全局代理,把这部分代码移动新项目中就没注意,微信访问单点登录这个功能点是现成的,所以在发生产包的时候,我在模拟公司内部接口的时候,访问一直是OK的,只要用户一通过微信进入,就一直报请求失败,我再重新模拟公司内部接口也会一直失败,但我把项目重新启动之后,又可以模拟成功。这就导致了一个循环,我不断修改代码然后打包,发布生产,模拟测试,用户微信测试,模拟测试再失败,这个问题真是弄了一天,发了无数次包。有个同事最后说了一句话提醒了我,说“我这项目是不是有缓存,或者设置了什么全局变量”,刚开始还没注意,但不断测试修改代码之后,慢慢就感觉是全局代理设置这个地方出问题了,找到问题之后,换了一种临时代理方式,修改好,再发布就可以OK了。

 

二)Http请求源码:

package com.oysept.http.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Proxy.Type;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;

/**
 * http请求工具类
 * @author ouyangjun
 */
public class HttpInvoker {
	
    private final static Logger LOGGER = LoggerFactory.getLogger(HttpInvoker.class);
	
    /**
     * HttpURLConnection
     * @param sUrl: 请求地址
     * @param sMethod: 请求方式GET、POST
     * @param sOutput: 请求参数
     * @param proxyHost: 代理地址
     * @param proxyPort: 代理IP
     * @param contentType: 请求Content-type
     * @return
     */
    public static JSONObject exec(String sUrl, String sMethod, String sOutput,
            String proxyHost, String proxyPort, String contentType) {
        JSONObject json = null;
        StringBuffer buffer = new StringBuffer();

        HttpURLConnection con = null;
        try {
            URL url = new URL(sUrl);
            if (!StringUtils.isEmpty(proxyHost) && !StringUtils.isEmpty(proxyPort)) {
                // 如果是本机自己测试,不需要代理请求,但发到服务器上的时候需要代理请求
                // 对http开启全局代理
                //System.setProperty("http.proxyHost", proxyHost);
                //System.setProperty("http.proxyPort", proxyPort);
                // 对https开启全局代理
                //System.setProperty("https.proxyHost", proxyHost);
                //System.setProperty("https.proxyPort", proxyPort);
				
                // 代理访问http请求
                Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
                con = (HttpURLConnection) url.openConnection(proxy);
            } else {
                // 原生访问http请求,未代理请求
                con = (HttpURLConnection) url.openConnection();
            }
			
            // json方式调用
            if (!StringUtils.isEmpty(contentType) && "JSON".equals(contentType)) {
                con.setRequestProperty("Content-type", "application/json");
            }
			
            con.setDoOutput(true); // 是否可以输出
            con.setDoInput(true); // 是否可以输入
            con.setUseCaches(false); // 是否可以使用缓存
            con.setRequestMethod(sMethod);
            con.setConnectTimeout(60000); // 最高超时时间
            con.setReadTimeout(60000); // 最高读取时间
            con.setConnectTimeout(60000); // 最高连接时间

            if (sOutput != null) {
                OutputStream os = con.getOutputStream();
                try {
                    os.write(sOutput.getBytes("UTF-8"));
                } catch (Exception e) {
                    LOGGER.info("HttpInvoker exec error: {}", e);
                } finally {
                    if (os != null) {
                        try {
                            os.close();
                        } catch (IOException e) {
                            LOGGER.info("HttpInvoker exec error: {}", e);
                        }
                    }
                }
            }

            InputStream is = null;
            InputStreamReader inputReader = null;
            BufferedReader reader = null;
            try {
                is = con.getInputStream();
                inputReader = new InputStreamReader(is, "UTF-8");
                reader = new BufferedReader(inputReader);
                String temp;
                while ((temp = reader.readLine()) != null) {
                    buffer.append(temp);
                }
                LOGGER.info("==>HttpInvoker exec buffer: {}", buffer==null||buffer.length()<=0?null:buffer.toString());
            } catch (Exception e) {
                LOGGER.info("HttpInvoker exec error: {}", e);
            } finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                    if (inputReader != null) {
                        inputReader.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    LOGGER.info("HttpInvoker exec error: {}", e);
                }
            }

            // con.disconnect();
            json = JSONObject.parseObject(buffer.toString());
            if (json != null) {
                LOGGER.info("OK, http连接Url: {}, 返回数据,json: {}", sUrl, json);
            } else {
                LOGGER.info("return json is null, http连接Url: {}, 返回数据,json: {}", sUrl, json);
            }
        } catch (IOException e) {
            LOGGER.info("HttpInvoker exec error: {}", e);
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
        return json;
    }
}

HttpURLConnection请求格式:

HttpInvoker.exec(sUrl, "POST", sOutput, proxyHost, proxyPort, "JSON");

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

你可能感兴趣的:(Java)