0

イントラネットのページにソースをダウンロードしようとしています。明示的にログインしなくても、すべてのブラウザでページにアクセスできます。

以下のコードを試してページのコンテンツを取得しようとすると、次のエラーコードで失敗します。

public scrape() throws IOException{

    String httpsURL = "https://myurl.aspx";
    URL myurl = new URL(httpsURL);
    HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
    InputStream ins = con.getInputStream();  //breaks here
    InputStreamReader isr = new InputStreamReader(ins);
    BufferedReader in = new BufferedReader(isr);

    String inputLine;

    while ((inputLine = in.readLine()) != null)
    {
        System.out.println(inputLine);
    }

    in.close();

}

エラー:スレッド "main"の例外java.io.IOException:サーバーがHTTP応答コードを返しました:URLの500:https://myurl.aspx

具体的には、次の行で中断します-> InputStream ins = con.getInputStream();

これを修正する方法がわかりません、何かアイデアはありますか?

4

1 に答える 1

1

最初に行うことは、コメントのnsfyn55のように、ブラウザを使用してヘッダーを検査することです。応答を返す前にUser-AgentHTTPヘッダーをチェックするWebサイトがあります。次に行うことは、HTTPSを使用する場合、セキュアレイヤーを適切に初期化する必要があるということです。このクラスを確認してください。

public class SSLConfiguration {

    private static boolean isSslInitialized = false;
    private static final String PROTOCOL = "SSL";
    public static boolean ACCEPT_ALL_CERTS = true;

    public static void initializeSSLConnection() {
        if (!isSslInitialized) {
            if (ACCEPT_ALL_CERTS) {
                initInsecure();
            } else {
                initSsl();
            }
        }
    }

    private static void initInsecure() {
        TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                }
            }
        };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance(PROTOCOL);
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
        }
        HttpsURLConnection.setDefaultHostnameVerifier(
                new HostnameVerifier() {

                    @Override
                    public boolean verify(String string, SSLSession ssls) {
                        return true;
                    }
                });
        isSslInitialized = true;
    }

    private static void initSsl() {
        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance(PROTOCOL);
        } catch (NoSuchAlgorithmException ex) {
            throw new RuntimeException(ex);
        }
        try {
            sc.init(null, null, new SecureRandom());
        } catch (KeyManagementException ex) {
            throw new RuntimeException(ex);
        }
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {

            @Override
            public boolean verify(String urlHostName, SSLSession session) {
                /* This is to avoid spoofing */
                return (urlHostName.equals(session.getPeerHost()));
            }
        };

        HttpsURLConnection.setDefaultHostnameVerifier(hv);
        isSslInitialized = true;
    }
}

特にWebサイトに適切な証明書がない場合は、接続が失敗する可能性が高くなります。コードのクラスのコンストラクター内に、次のコードを挿入します。

SSLConfiguration.initializeSSLConnection();

考慮すべきいくつかの事柄-openConnectionそれが推奨された後、あなたは以下を追加しました:

con.setRequestMethod(METHOD);
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);

User-Agentただし、リモートサーバーから応答を受け取るので、適切なヘッダー、特にとを指定することが重要であると私は信じていますAccept。上記が問題の解決に役立たない場合は、エラーのスタックトレースを出力し、(リモートからの)エラーストリームを読み取って、より意味のあるエラーメッセージを取得します。Firefoxを使用している場合、LiveHTTPヘッダーは非常に便利なソリューションです。また、 cURLは、HTTPリクエストを処理する際の最高のコマンドラインツールです。

于 2012-04-30T18:32:39.510 に答える