web-dev-qa-db-fra.com

java.io.IOException: le serveur a renvoyé le code de réponse HTTP: 403 pour l'URL

Mon code va comme ceci:

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);

Cependant, lorsque j'essaie d'accéder à l'URL via un navigateur, il n'y a pas de problème, mais lorsque j'essaie d'y accéder via un programme Java, il lance une attente:

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

Quelle est la solution?

23
vaibhav

Ajoutez le code ci-dessous entre uc.connect(); et uc.getInputStream();:

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

Cependant, c'est une bonne idée d'autoriser uniquement certains types d'agents utilisateurs. Cela gardera votre site Web en sécurité et l'utilisation de la bande passante faible.

Certains mauvais "agents utilisateurs" que vous voudrez peut-être bloquer sur votre serveur, si vous ne voulez pas que des gens lachent votre contenu et votre bande passante. Mais, l'agent utilisateur peut être usurpé comme vous pouvez le voir dans mon exemple ci-dessus.

47
Nishant

403 signifie interdit. De ici : -

10.4.4 403 Interdit

Le serveur a compris la demande, mais refuse de la satisfaire. L'autorisation n'aidera pas et la demande NE DEVRAIT PAS être répétée. Si la méthode de demande n'était pas HEAD et que le serveur souhaite rendre public pourquoi la demande n'a pas été satisfaite, il DEVRAIT décrire la raison du refus dans l'entité. Si le serveur ne souhaite pas mettre ces informations à la disposition du client, le code d'état 404 (Introuvable) peut être utilisé à la place.

Vous devez contacter le propriétaire du site pour vous assurer que les autorisations sont correctement définies.

[~ # ~] modifier [~ # ~] Je vois votre problème. J'ai exécuté l'URL via Fiddler. J'ai remarqué que je reçois un 407, ce qui signifie ci-dessous. Cela devrait vous aider à aller dans la bonne direction.

10.4.8 Authentification proxy 407 requise

Ce code est similaire à 401 (non autorisé), mais indique que le client doit d'abord s'authentifier auprès du proxy. Le mandataire DOIT retourner un champ d'en-tête Proxy-Authenticate (section 14.33) contenant un défi applicable au mandataire pour la ressource demandée. Le client PEUT répéter la demande avec un champ d'en-tête Proxy-Authorization approprié (section 14.34). L'authentification d'accès HTTP est expliquée dans "Authentification HTTP: Authentification d'accès de base et Digest"

Voir également cette question pertinente.

4
CoolBeans

SI le navigateur peut accéder à la page et que votre code ne le peut pas, alors il y a quelque chose de différent entre la demande du navigateur et votre demande. Vous pouvez consulter la demande du navigateur, en utilisant, par exemple, Firebug, pour voir quelles sont les différences. Certaines choses auxquelles je peux penser sont:

  • Le site installe un cookie (peut-être lors de la connexion). Vous pourrez peut-être gérer cela dans le code, vous devrez ajouter explicitement la prise en charge du passage du cookie. C'est très probable.

  • Le site filtre en fonction des agents utilisateurs. Vous pouvez définir l'agent utilisateur. Ce n'est pas aussi probable.

2
ykaganovich