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

14

在试图使用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)**

出现这个错误的可能原因是什么?


在进行“instanceof”测试之后进行强制转换没有什么意义,而且将其强制转换为您甚至不使用的类也没有任何意义。只需将其用作URLConnection即可。 - user207421
'instanceof' 仅用于测试目的。类型转换错误出现在此行:HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); - DKingKumar
代码正在正常运行..这里是输出结果http://sebsauvage.net/paste/?987346d13f71f550#800M7Vwk73Y5OOPpLhwIleZdktYk+vf0VAZKOtOoqfw= - Jyoti Ranjan
instanceof 在错误的位置被用于测试目的,是在抛出 ClassCastException 的代码之后。这就是我的观点。另外,你不需要进行强制类型转换。当你尝试过后会发生什么? - user207421
我正在使用Ecclipse和Weblogic 10.3.4服务器。如果我将其作为Java应用程序运行,则一切正常。但是,如果我尝试在“服务器上运行”,那么它就会抛出异常:“weblogic.net.http.SOAPHttpsURLConnection无法转换为javax.net.ssl.HttpsURLConnection”。 - DKingKumar
5个回答

36

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

set JAVA_OPTIONS=%JAVA_OPTIONS% -DUseSunHttpHandler=true

...在服务器域内的类路径中。

这将告诉Weblogic服务器使用Sun Http处理程序而不是安装自己的处理程序。


嗨!我也遇到了同样的问题,但我不知道应该把这些指令放在哪里... 也许是通过管理控制台,在服务器启动选项卡中? - Aitor
3
你需要将这个设置放在bin文件夹内的setDomainEnv文件中。 - DKingKumar
你能发布完整的路径和完整的文件名吗? - Accollativo
得到了完全相同的问题,在生产环境中。非常帮助我。 - viveksinghggits
1
这个解决方案是一个变通方法,因为有时在服务器安装中不允许这样做。 - Eduardo Yáñez Parareda
显示剩余2条评论

28

您还可以明确定义协议处理程序。只需使用另一个构造函数创建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选项无关。


1
这是实际的好答案。应该通过编程来解决,因为有时您无法(被允许)更改Weblogic的设置。 - Eduardo Yáñez Parareda
谢谢,这真的很有帮助,不需要更改服务器配置。 - Ashish
这是一个很好的答案:没有依赖于Web容器。问题在于sun.net.www.protocol.https.Handler是一个专有API,它可能会从JDK中删除。 - kaleemsagard

4

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

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

谢谢您的评论。这个选项也可以工作。 您知道使用此选项是否仍然可以在同一Weblogic集群上运行的其他应用程序中使用默认的Weblogic HttpHandler吗? - Nicolas Forney

2
更多关于@KmrGtm解决方案的详细信息:
唯一需要做的就是更新setDomainEnv脚本文件中的WebLogic域设置。
相关设置位于setDomainEnv脚本文件中(Windows为setDomainEnv.cmd,Linux为setDomainEnv.sh)。
该文件位于域目录(/user_projects/domains//bin/)的bin子目录中,其中:
- 是您安装WebLogic的目录。 - 是您正在安装Studio的域的名称。
在文件中,在文件顶部附近添加JAVA_OPTIONS参数:
- 对于setDomainEnv.cmd(Windows):
set JAVA_OPTIONS=%JAVA_OPTIONS% -DUseSunHttpHandler=true - 对于setDomainEnv.sh(Linux):
JAVA_OPTIONS="%JAVA_OPTIONS% -DUseSunHttpHandler=true" export JAVA_OPTIONS

0

java.lang.ClassCastException:weblogic.net.http.SOAPHttpsURLConnection无法转换为javax.net.ssl.HttpsURLConnection(文档ID 2332805.1)

根据上述Oracle文档,应使用以下参数:

-DUseJSSECompatibleHttpsHandler=true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接