web-dev-qa-db-ja.com

java.io.IOException:サーバーがHTTP応答コードを返しました:URLの403

私のコードは次のようになります:

URL url;
URLConnection uc;
StringBuilder parsedContentFromUrl = new StringBuilder();
String urlString="http://www.example.com/content/w2e4dhy3kxya1v0d/";
System.out.println("Getting content for URl : " + urlString);
url = new URL(urlString);
uc = url.openConnection();
uc.connect();
uc.getInputStream();
BufferedInputStream in = new BufferedInputStream(uc.getInputStream());
int ch;
while ((ch = in.read()) != -1) {
    parsedContentFromUrl.append((char) ch);
}
System.out.println(parsedContentFromUrl);

ただし、ブラウザを介してURLにアクセスしようとしても問題はありませんが、Javaプログラムを介してアクセスしようとすると、予期がスローされます。

Java.io.IOException: Server returned HTTP response code: 403 for URL

解決策は何ですか?

23
vaibhav

uc.connect();uc.getInputStream();の間に以下のコードを追加します。

uc = url.openConnection();
uc.addRequestProperty("User-Agent", 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");

ただし、特定の種類のユーザーエージェントのみを許可するのは良い考えです。これにより、Webサイトが安全に保たれ、帯域幅の使用量が低くなります。

ユーザーがコンテンツや帯域幅をリーチさせたくない場合に、サーバーからブロックする必要のある可能性のある悪い「ユーザーエージェント」。ただし、上記の例でわかるように、ユーザーエージェントはなりすましの可能性があります。

45
Nishant

403は禁止を意味します。から ここ :-

10.4.4 403禁止

サーバーはリクエストを理解しましたが、それを実現することを拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。リクエストメソッドがHEADでなく、サーバーがリクエストが実行されなかった理由を公開したい場合、エンティティでの拒否の理由を記述する必要があります。クライアントがこの情報を利用できるようにする場合は、代わりにステータスコード404(Not Found)を使用できます。

アクセス許可が適切に設定されていることを確認するには、サイトの所有者に連絡する必要があります。

[〜#〜] edit [〜#〜]あなたの問題がわかりました。 Fiddlerを介してURLを実行しました。以下を意味する407を取得していることに気付きました。これにより、正しい方向に進むことができます。

10.4.8 407プロキシ認証が必要

このコードは401(Unauthorized)に似ていますが、クライアントが最初にプロキシで自身を認証する必要があることを示しています。プロキシは、要求されたリソースのプロキシに適用可能なチャレンジを含むProxy-Authenticateヘッダーフィールド(セクション14.33)を返さなければなりません。クライアントは、適切なProxy-Authorizationヘッダーフィールドを使用してリクエストを繰り返すことができます(セクション14.34)。 HTTPアクセス認証については、「HTTP認証:基本およびダイジェストアクセス認証」で説明しています。

関連する質問もご覧ください。

4
CoolBeans

ブラウザーがページにアクセスでき、コードがアクセスできない場合、ブラウザーのリクエストとリクエストの間には何か異なる点があります。 Firebugなどを使用して、ブラウザーのリクエストを見て、違いを確認できます。私が考えることができるいくつかのことは次のとおりです。

  • サイトはCookieを設定します(おそらくログイン中に)。コードでこれを処理できる場合があります。Cookieを渡すためのサポートを明示的に追加する必要があります。これはほとんどの場合です。

  • サイトはユーザーエージェントに基づいてフィルタリングします。ユーザーエージェントを設定できます。これはそうではありません。

2
ykaganovich