美文网首页
weblogic.net.http.SOAPHttpsURLCo

weblogic.net.http.SOAPHttpsURLCo

作者: 可爱傻妞是我的爱 | 来源:发表于2018-04-10 14:37 被阅读104次

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 。然后重新启动这些服务即可。

相关文章

网友评论

      本文标题:weblogic.net.http.SOAPHttpsURLCo

      本文链接:https://www.haomeiwen.com/subject/jcxnhftx.html