9

URL が "http://" で始まるサイトがありますが、例外としてメッセージ - サポートされていないプロトコル: https が表示されます。サイトが HTTPS プロトコルを使用しているにもかかわらず、その URL が「https://」ではなく「http://」で始まっている可能性はありますか?

public ActionForward executeAction(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
      throws Exception {

    ActionForward forward = mapping.findForward(Constants.SUCCESS);
    String link = "http://abc.fgh.jkl.mno";
    URL thisURL;
    HttpURLConnection conn = null;
    try {
        thisURL = new URL(link);
        conn = (HttpURLConnection) thisURL.openConnection();
        System.out.println(conn.getResponseCode());
        System.out.println(conn.getResponseMessage());
        } catch (Exception ex) {
        ex.printStackTrace();
    }
    return forward;
}       

スタックトレース

java.net.ProtocolException: Unsupported protocol: https'
    at weblogic.net.http.HttpClient.openServer(HttpClient.java:342)
    at weblogic.net.http.HttpClient.New(HttpClient.java:238)
    at weblogic.net.http.HttpURLConnection.connect(HttpURLConnection.java:172)
    at weblogic.net.http.HttpURLConnection.followRedirect(HttpURLConnection.java:643)
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:422)
    at           weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:36)
    at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:947)
    at com.cingular.cscape.da.struts.action.thisAction.executeAction(thisAction.java:56)
    at com.cingular.cscape.da.struts.action.BaseAction.execute(BaseAction.java:300)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    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:292)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:53)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3496)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)                  
4

3 に答える 3

13

例外メッセージ内の一致しないアポストロフィに気付きましたか?

java.net.ProtocolException: Unsupported protocol: https'
                                                       ^

更新: このアポストロフィは、WebLogic HttpClient がこの例外を出力する方法の癖にすぎないようです。

Asker の根本的な問題は、チャット セッションで特定されました。彼は http:// URL にアクセスしており、それが彼を https:// URL にリダイレクトしています。その https アドレスの Web サーバーは、彼の JRE/HttpClient が信頼しない証明書を提供しています。

実際の例外は SSLKeyException である必要があります。WebLogic HttpClient は、この問題をサポートされていないプロトコルの問題として誤って報告していると思います。中心的な問題は次のとおりだと思います。

<Warning> <Security> <BEA-090477> javax.net.ssl.SSLKeyException: [Security:090477] Certificate chain received from www.X.com - nnn.nnn.nnn.nnn was not trusted causing SSL handshake failure.

これは、アスカーが https:// URL に (リダイレクト チェーンを介してではなく) 直接アクセスするときに表示されるメッセージです。

デフォルトでは、Java の Http[s]URLConnection は、自動的かつ静かにリダイレクトに従います。リダイレクト先が気になる場合は、次のコードを試してください。

connection.setInstanceFollowRedirects(false);
String location = connection.getHeaderField("Location");
System.out.println("Redirected to: " + location);

リダイレクト先の URL は、最大でhttp.maxRedirects回まで、何度も何度も別の場所にリダイレクトされる可能性があることに注意してください。リダイレクトは、このように「連鎖」する場合があります。連鎖する場合は、リダイレクトを発行しない URL に到達するまで、リダイレクトをたどる必要があります。それは、URL 接続が最終的に終了する場所setInstanceFollowRedirects(true)です。

また、sun.net.www.protocol.http.HttpURLConnection でいくつかのコードを見つけました。これは、HttpURLConnection がロジックに続く自動リダイレクトの一部としてプロトコルの切り替え (HTTP -> HTTPS) をサポートしていない可能性があることを示しているようです。

private boolean followRedirect() throws IOException {
    // ... [snip] ...
    if (!url.getProtocol().equalsIgnoreCase(locUrl.getProtocol())) {
        return false;
    // ... [snip] ...

WebLogic には HttpURLConnection の独自の (異なる) 実装がありますが、プロトコルの切り替えを防ぐために同様のロジックが含まれている場合があります。そのため、質問者が証明書の信頼性の問題を解決したとしても、HttpURLConnection を使用して、HTTP から HTTPS へのリダイレクト チェーンを自動的にたどることができない場合があります。setInstanceFollowRedirects(false)回避策は、リダイレクトを手動で使用して従うことです。または、HTTPS サイトに直接アクセスします。

于 2013-01-04T17:27:52.950 に答える
5

HTTP は、TCP/IP 上で動作するプロトコルです。HTTPS はセキュア ソケット (SSL または新しい TLS) 上の HTTP です。さて、URLとは?これはリソースを識別する文字列で、おおよそ次のようになります。

scheme://host:port/path/to/resource

一部のプロトコルには既知のポート番号が関連付けられているため、ポート番号を指定しない場合があることに注意してください。HTTP の場合は 80、HTTPS の場合は 443 であるため、これらの数値は暗示されています。ただし、サーバー ソケットは任意のポートにバインドできることに注意してください。HTTP サーバー プログラムにソケットを localhost のポート 8273 にバインドするように指示すると、喜んでバインドされます。

あなたの場合、メッセージには「サポートされていないプロトコル: https」と表示されます。ここで推測することはできますが、URL に渡す文字列は、あなたが考えているものではないと思います。

于 2013-01-04T17:09:37.297 に答える
0

もう 1 つの可能性は、HTTP アドレスが HTTPS URL への 3xx リダイレクト応答で応答することです。クライアントはこれをたどろうとしますが、サポートしていません。tcpdump または wireshark を使用してネットワーク トラフィックをキャプチャすることで、非常に効果的です。

HTTPS をサポートする Java HTTP クライアント ライブラリは数多くありますが、そのうちの 1 つに切り替えてみませんか?

于 2013-01-05T12:02:00.477 に答える