weblogic.net.http.SOAPHttpsURLConnection无法强制转换为javax.net.ssl.HttpsURLConnection

时间:2013-08-29 13:12:04

标签: java ssl weblogic httpsurlconnection

尝试使用javax.net.ssl.HttpsURLConnection连接到url时,我收到“java.lang.ClassCastException”。

我使用的是Weblogic Server 10.3.4。

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



import java.security.cert.X509Certificate;


import java.io.BufferedReader;
import java.io.InputStreamReader;

import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author kmrgtm
 *
 */
public class GatewayConnect {


public void ConnectURL()
{
    try
    {

        System.out.println("***** Inside Class File *****");
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

    String urlstr="https://www.google.co.in";

    URL url = new URL(urlstr);

    HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();

    conn  = (HttpsURLConnection)url.openConnection();


        if (conn instanceof javax.net.ssl.HttpsURLConnection) {
        System.out.println("*** openConnection returns an instanceof javax.net.ssl.HttpsURLConnection");
        }
        if (conn instanceof HttpURLConnection) {
        System.out.println("*** openConnection returns an instnace of HttpURLConnection");
        }
    conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
    BufferedReader reader = null;
    reader = new BufferedReader(new InputStreamReader( conn.getInputStream()));
    for (String line; (line = reader.readLine()) != null;) {
        System.out.println("##### line iz :::"+line);
    }




}

catch(Exception e)
{
    e.printStackTrace();
}
}



}

我得到的例外是:

**java.lang.ClassCastException: weblogic.net.http.SOAPHttpsURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection
Inside the MessageSendingAction
***** Inside Class File *****
    at com.secureConnect.GatewayConnect.ConnectURL(GatewayConnect.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(Unknown Source)
    at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:78)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:57)
    at javax.faces.component.UICommand.broadcast(UICommand.java:127)
    at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
    at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304)
    at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)
    at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:474)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:183)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)**

出现此错误的任何可能原因?

4 个答案:

答案 0 :(得分:31)

我终于得到了解决方案。如果我们使用Weblogic服务器,我们必须定义:

set JAVA_OPTIONS=%JAVA_OPTIONS% -DUseSunHttpHandler=true

...在Server Domain内的类路径中。

这将告诉weblogic服务器使用Sun Http Handler而不是自己安装。

答案 1 :(得分:13)

您还可以显式定义协议处理程序。只需使用其他构造函数创建URL。

URL url = new URL(null, urlstr, new sun.net.www.protocol.http.Handler());

URL url = new URL(null, urlstr, new sun.net.www.protocol.https.Handler());

它将使代码独立于-DUseSunHttpHandler选项。

答案 2 :(得分:1)

关于@KmrGtm解决方案的更多细节:

唯一要做的就是更新setDomainEnv脚本文件中的WebLogic域设置。

相关设置位于setDomainEnv脚本文件中(Windows的setDomainEnv.cmd和Linux的setDomainEnv.sh)。

该文件位于域目录的bin子目录中(/ user_projects / domains // bin /),其中:

  • 是您安装WebLogic的目录。
  • 是您要安装Studio的域的名称。

在文件中添加靠近文件顶部的JAVA_OPTIONS参数:

  • 对于setDomainEnv.cmd(Windows):

设置JAVA_OPTIONS =%JAVA_OPTIONS%-DUseSunHttpHandler = true

  • 对于setDomainEnv.sh(Linux):

JAVA_OPTIONS =“%JAVA_OPTIONS%-DUseSunHttpHandler = true”

导出JAVA_OPTIONS

答案 3 :(得分:0)

从 12.2.1.3.0 开始,您可以通过使用新的 Java 系统属性 -DUseJSSECompatibleHttpsHandler=true 获取扩展 javax.net.ssl.HttpsURLConnection 的 HttpsURLConnection 实例来启用新的兼容 HTTPS 连接实现类。

weblogic.net.http.CompatibleSOAPHttpsURLConnection (extending 
javax.net.ssl.HttpsURLConnection) is returned instead of 
weblogic.net.http.SOAPHttpsURLConnection (not extending 
javax.net.ssl.HttpsURLConnection) that can avoid the ClassCastException 

请注意,当同时指定 -DUseSunHttpHandler=true-DUseJSSECompatibleHttpsHandler=true 时,-DUseSunHttpHandler 将优先于 -DUseJSSECompatibleHttpsHandler