0

特定の URL からソース コードを収集する次のコード行があります。

URL url = new URL(websiteAddress);
URLConnection connection = url.openConnection();  // throws an IOException
connection.setConnectTimeout(timeoutInMilliseconds);
bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String line;
while ((line = bufferedReader.readLine()) != null) {
    outputString += line;
}

しかし、私が抱えている問題は、Wi-Fi ホットスポットが「同意する」をクリックしなければならないページにリダイレクトされることが多いことです。チェックボックスをクリックする前にこのコードを実行すると、目的のページではなく、ホットスポット ログイン ページからソース コードが収集されます。

私がやりたいのは、目的のページに到達したかどうかを確認する方法です。InputStreamReader を作成した後に呼び出すとconnection.getURL()、実際に到着した Web ページが表示されることを期待していましたが、そのような運はありませんでした。意図した URL がリダイレクトされたかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

1

1 つの方法は、ページ内の特定の要素を探すことwebです。そこにない場合は、別のページにいる可能性があることがわかります (ログイン ページにリダイレクトされる可能性があります)。

于 2013-09-10T21:34:21.443 に答える
0

1 つのオプションは、 を呼び出すことsetFollowRedirects(false)です。デフォルトでは、接続は静かにリダイレクトに従い、200HTTP 応答を返すページに到達しようとします。リダイレクト フォローを無効にすると、期待されるページが返されることを簡単に確認できるようになります。単に応答が200.

とはいえ、@rec のコメントは考慮に入れる価値があります。ルーターがリクエストを中断する方法はさまざまにあり、その多くは検出できないため、単に応答コードを確認するだけでは十分ではありません。たとえば、悪意のあるルーターはすべてのリクエストを傍受し、応答するコンテンツを微妙ではあるが危険な方法で変更する可能性があります。これは中間者攻撃と呼ばれます。

定義上、自分とリモート サイトの間に安全で信頼できる接続 (通常は HTTPS) を開くことができない限り、MitM 攻撃を回避することはできません。 back はさまざまな方法で壊れる可能性があり、代わりにスクレイピング ロジックをその可能性に対してより堅牢にします。

ユースケースと遭遇した問題を理解せずにロジックをより堅牢にする方法について直接話すことはできませんが、要点は、問題が発生する可能性のある場所にチェックを追加し、例外をスローして処理することです。スタックを優雅に上に上げます。

たとえば、コードが次の場合:

System.out.println(outputString.subString(outputString.indexOf('A'));

outputString didn't actually have an'A'` 文字の場合、これは失敗します。したがって、明示的に確認してください:

int aPos = outputString.indexOf('A');
if (aPos < 0) {
  throw new InvalidParseException("Didn't find an 'A', cannot proceed");
}
System.out.println(outputString.subString(aPos);

そしてInvalidParseException、ユースケースにとって最も理にかなっている場所を処理します。

于 2014-01-06T08:40:48.980 に答える