JAVA 发送 Https 请求 及 在webLogin和tomcat下的配置

本人目前在 开发兼维护兰州大市场的项目 , 由于与另一个系统的接口变化,需使用https 的方式在后台发送 请求。

编写端口 时 遇到的问题 和解决办法同大家分享下

如下是https发送请求的实现代码。

package cn.com.gsjiahua.eaglefortune.test;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;


import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;


public class HttpsUtil {
public static String URL = "https://www.x.cn";


    private static class DefaultTrustManager implements X509TrustManager {
       
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }


        
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }


        
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }


    public static HttpsURLConnection getHttpsURLConnection(String uri) throws IOException {
        SSLContext ctx = null;
        try {
            ctx = SSLContext.getInstance("TLS");
            ctx.init(new KeyManager[0], new TrustManager[] { new DefaultTrustManager() }, new SecureRandom());
        } catch (KeyManagementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        SSLSocketFactory ssf = ctx.getSocketFactory();
        
        URL url = new URL(uri);
        HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
        httpsConn.setSSLSocketFactory(ssf);
        httpsConn.setHostnameVerifier(new HostnameVerifier() {
            
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        httpsConn.setDoInput(true);
        httpsConn.setDoOutput(true);
        return httpsConn;
    }
    
    public static String getHttpsResult(String url) {
    String result = "";
    BufferedReader in = null;
    try {
in = new BufferedReader(new InputStreamReader(getHttpsURLConnection(url).getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (IOException e) {
System.out.println("发送Https请求出现异常!message:" + e.getMessage()+",url:"+url);
e.printStackTrace();
}
    finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
    }
    
    public static String detect(String uid, String applyId, String pay_time) {
    String url = URL+"";
    String res = getHttpsResult(url);
return res;
    }
    
   
}


当将程序部署到weblogic 服务器 时又出现 

weblogic.net.http.SOAPHttpsURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection

的问题。
具体查询后原来是 在WEBLOGIC没有对使用的SSL实现类进行配置的情况下,在程序中如果正常使用java.net.URL的不带 URLStreamHandler 参数的构造方法new 一个URL对象的话(URL url = new URL(requestUrl);),url.openConnection()默认是返回SOAPHttpsURLConnection类型对象,导致转换失败。

解决办法是,可以在启动脚本中(比如startWebLogic.sh,startWebLogic.cmd)在JAVA_OPTIONS增加 -DUseSunHttpHandler=true ,例如
@ECHO OFF


@REM WARNING: This file is created by the Configuration Wizard.
@REM Any changes to this script may be lost when adding extensions to this configuration.


SETLOCAL


set DOMAIN_HOME=C:\Oracle\Middleware\Oracle_Home\user_projects\domains\market
set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS% %JAVA_PROPERTIES% -DUseSunHttpHandler=true 
call "%DOMAIN_HOME%\bin\startWebLogic.cmd" %*


 






ENDLOCAL

其实就是 告诉WebLogic使用Sun的HttpHandler而不要使用WebLogic自己的。这样配置后使用url.openConnection()就会返回HttpsURLConnection类型对象了。
正确配置后,部署 运行正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值