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)**
このエラーが発生する理由は何ですか?
ようやく解決策を得ました。 Weblogicサーバーを使用している場合、以下を定義する必要があります。
set Java_OPTIONS=%Java_OPTIONS% -DUseSunHttpHandler=true
...サーバードメイン内のクラスパス内。
これにより、weblogicサーバーはSun Http Handlerを使用し、独自にインストールしないようになります。
プロトコルハンドラを明示的に定義することもできます。別のコンストラクタを使用して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
オプションから独立させます。
@KmrGtmソリューションの詳細:
すべきことは、setDomainEnvスクリプトファイルのWebLogicドメイン設定を更新することだけです。
関連する設定は、setDomainEnvスクリプトファイル(Windowsの場合はsetDomainEnv.cmd、Linuxの場合はsetDomainEnv.sh)にあります。
このファイルは、ドメインディレクトリのbinサブディレクトリ(/ user_projects/domains // bin /)にあります。
ファイルで、ファイルの先頭近くにJava_OPTIONS引数を追加します。
set Java_OPTIONS =%Java_OPTIONS%-DUseSunHttpHandler = true
Java_OPTIONS = "%Java_OPTIONS%-DUseSunHttpHandler = true"
Java_OPTIONSをエクスポート