public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
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(); log.info("CommonUtil ===========1111111111111=========== "); URL url = new URL(requestUrl); //1 URL url = new URL(null,requestUrl,new com.sun.net.ssl.internal.www.protocol.https.Handler()); //2 URL url = new URL(null,requestUrl,new sun.net.www.protocol.https.Handler()); log.info("CommonUtil ===========22222222222=========== "); // SOAPHttpsURLConnection cc = null; HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求方式 (GET/POST) conn.setRequestMethod(requestMethod);
程序在tomcat上没问题,在weblogic上跑报错,日志错误为:
java.lang.ClassCastException: weblogic.net.http.SOAPHttpsURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection at com.nnn.msg.weixin.util.CommonUtil.httpsRequest(CommonUtil.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
2、问题原因:
服务器环境的原因导致了报错,查看相关资料。
①在WEBLOGIC没有对使用的SSL实现类进行配置的情况下,在程序中如果正常使用java.net.URL的不带 URLStreamHandler 参数的构造方法new 一个URL对象的话(URL url = new URL(requestUrl);),url.openConnection()默认是返回SOAPHttpsURLConnection类型对象,导致转换失败。
3、解决办法:
①看到网上的解决办法将URL url = new URL(requestUrl);改成URL url = new URL(null,requestUrl,new com.sun.net.ssl.internal.www.protocol.https.Handler());
尝试了下,在本地Tomact上都不通过,后来在服务器weblogic上测试还是失败。
②将URL url = new URL(requestUrl);改成URL url = new URL(null,requestUrl,new sun.net.www.protocol.https.Handler());本地tomcat测试没问题,服务器weblogic上测试还是失败。
③从Weblogic配置的层面上解决报错的问题。对于单机的Weblogic配置,可以在启动脚本中(比如startWebLogic.sh)在JAVA_OPTIONS增加 -DUseSunHttpHandler=true ,例如
set JAVA_OPTIONS=%JAVA_OPTIONS% %JAVA_PROPERTIES% -DUseSunHttpHandler=true -Dwlw.iterativeDev=%iterativeDevFlag% -
Dwlw.testConsole=%testConsoleFlag% -Dwlw.logErrorsToConsole=% logErrorsToConsoleFlag%
如果是配置了集群,则不必在启动脚本中增加参数,可以在weblogic控制台中针对特定server配置此参数
这个参数的目的就是告诉WebLogic使用Sun的HttpHandler而不要使用WebLogic自己的。这样配置后使用url.openConnection()就会返回HttpsURLConnection类型对象了。所以在weblogic控制台上,选择对应的服务器,设置器启动参数,添加-DUseSunHttpHandler=true 。然后重新启动这些服务即可。