java请求https,在本地可以,在服务器端请求失败

java请求https,在本地可以,在服务器端请求失败,是服务器端失败哦!
自己的前提是请求的url是正确的。
附上https请求代码,请大神一看:

 public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
            httpUrlConn.setSSLSocketFactory(ssf);

            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            httpUrlConn.setRequestMethod(requestMethod);

            if ("GET".equalsIgnoreCase(requestMethod))
                httpUrlConn.connect();

            // 当有数据需要提交时
            if (null != outputStr) {
                OutputStream outputStream = httpUrlConn.getOutputStream();
                // 注意编码格式,防止中文乱码
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();

            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        } catch (ConnectException ce) {
            log.error("Weixin server connection timed out.");
        } catch (Exception e) {
            log.error("https request error:{}", e);
        }
        return jsonObject;
    }

8个回答

在服务器上ping一下目的主机看目的主机是否可达
若目的主机可达再用nc命令测一下目的端口(https)是否可达
nc -v hostname https

忘了结贴:其实发送不出去是因为自己的服务器配置没有配好,端口443和80没有开启,导致数据传输不出去.....

Mia_Zhu
pengyanak 回复成名驴01: 这个不是很清楚啊...
大约 2 年之前 回复
chengminglv
成名驴01 报错是连接超时,错误信息最后一条评论里,就是不知道,服务器该怎么配置。
大约 2 年之前 回复
Mia_Zhu
pengyanak 能ping通说明你的端口开着的,看看你的代码在服务器端的报错
大约 2 年之前 回复
chengminglv
成名驴01 回复Mia_Zhu: 感谢回复! 目的ip 是能ping通的,就是不会 开443端口,百度的方法不太合适。
大约 2 年之前 回复
Mia_Zhu
pengyanak 回复成名驴01: 其实是这样的,你项目跑在服务器端,你的服务器有一个配置,应该是对端口的一个控制,有的服务器很多端口都是关着的,所以你要在服务器上ping一下你需要连接的域名或者ip,看看是否能ping通,ping不通说明https用的端口443没有开,所以要在服务器端开了443这个端口
大约 2 年之前 回复
chengminglv
成名驴01 能否详细说下,本人新手也遇到这个问题了,感觉咱俩问题一样。
大约 2 年之前 回复

虽然没太明白什么意思,但应该是跨域的问题,使用jsonp应该会好

Mia_Zhu
pengyanak 额,不是的,用这个方法是请求一个https的连接,在本地可以,项目放在服务器上面就time out
接近 3 年之前 回复

请求https,服务器应该需要证书吧

请了解一下https协议,它和http差别很大的:http://blog.csdn.net/lxqluo/article/details/6960306

将HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
改成URLConnection httpUrlConn = url.openConnection();

报错,连接超时:
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:550)
at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)
at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:271)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:328)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:793)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:896)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at com.synch.SSOEmailService.sendPostHttps(SSOEmailService.java:91)
at com.synch.SSOEmailService.main(SSOEmailService.java:29)
************result:


baidu_41720739
baidu_41720739 请问这个连接超时的问题如何解决的呢
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问