Je ne comprends pas pourquoi Java HttpURLConnection
ne suit pas une redirection HTTP d'un HTTP vers une URL HTTPS. J'utilise le code suivant pour obtenir la page à l' adresse https://httpstat.us/ :
import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;
public class Tester {
public static void main(String argv[]) throws Exception{
InputStream is = null;
try {
String httpUrl = "http://httpstat.us/301";
URL resourceUrl = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.connect();
is = conn.getInputStream();
System.out.println("Original URL: "+httpUrl);
System.out.println("Connected to: "+conn.getURL());
System.out.println("HTTP response code received: "+conn.getResponseCode());
System.out.println("HTTP response message received: "+conn.getResponseMessage());
} finally {
if (is != null) is.close();
}
}
}
Le résultat de ce programme est:
URL d'origine: http://httpstat.us/301 Connecté à: http://httpstat.us/301 Code de réponse HTTP reçu: 301 Message de réponse HTTP reçu: déplacé définitivement
Une requête à http://httpstat.us/301 renvoie la réponse (abrégée) suivante (qui semble tout à fait juste!):
HTTP/1.1 301 Moved Permanently
Cache-Control: private
Content-Length: 21
Content-Type: text/plain; charset=utf-8
Location: https://httpstat.us
Malheureusement, Java HttpURLConnection
ne suit pas la redirection!
Notez que si vous modifiez l'URL d' origine HTTPS ( https://httpstat.us/301 ), Java va suivre la redirection comme prévu !?
java
redirect
https
httpurlconnection
http-redirect
Shcheklein
la source
la source
Réponses:
Les redirections ne sont suivies que si elles utilisent le même protocole. (Voir la
followRedirect()
méthode dans la source.) Il n'y a aucun moyen de désactiver cette vérification.Même si nous savons qu'il reflète HTTP, du point de vue du protocole HTTP, HTTPS n'est qu'un autre protocole complètement différent et inconnu. Il serait dangereux de suivre la redirection sans l'approbation de l'utilisateur.
Par exemple, supposons que l'application soit configurée pour effectuer automatiquement l'authentification client. L'utilisateur s'attend à surfer de manière anonyme car il utilise HTTP. Mais si son client suit HTTPS sans demander, son identité est révélée au serveur.
la source
HttpURLConnection
ne suivra pas automatiquement les redirections vers un protocole différent, même si l'indicateur de redirection est défini.HttpURLConnection par conception ne redirigera pas automatiquement de HTTP vers HTTPS (ou vice versa). La suite de la redirection peut avoir de graves conséquences sur la sécurité. SSL (donc HTTPS) crée une session qui est unique à l'utilisateur. Cette session peut être réutilisée pour plusieurs demandes. Ainsi, le serveur peut suivre toutes les demandes faites par une seule personne. C'est une forme d'identité faible et exploitable. En outre, la négociation SSL peut demander le certificat du client. Si elle est envoyée au serveur, l'identité du client est donnée au serveur.
Comme le souligne erickson , supposons que l'application soit configurée pour effectuer automatiquement l'authentification client. L'utilisateur s'attend à surfer de manière anonyme car il utilise HTTP. Mais si son client suit HTTPS sans demander, son identité est révélée au serveur.
Le programmeur doit prendre des mesures supplémentaires pour s'assurer que les informations d'identification, les certificats clients ou l'identifiant de session SSL ne seront pas envoyés avant la redirection de HTTP vers HTTPS. La valeur par défaut est de les envoyer. Si la redirection blesse l'utilisateur, ne suivez pas la redirection. C'est pourquoi la redirection automatique n'est pas prise en charge.
Cela dit, voici le code qui suivra les redirections.
la source
location = URLDecoder.decode(location...
partie. Cela décode une partie relative codée de travail (avec espace = + dans mon cas) en une partie non fonctionnelle. Après l'avoir retiré, c'était OK pour moi.A quelque chose appelé
HttpURLConnection.setFollowRedirects(false)
par hasard?Tu pourrais toujours appeler
si vous voulez vous assurer de ne pas affecter le reste du comportement de l'application.
la source
setFollowRedirects
le type,setInstanceFollowRedirects
c'est une méthode d' instance et ne peut pas être appelée sur le type.Comme mentionné par certains d'entre vous ci-dessus, les instructions setFollowRedirect et setInstanceFollowRedirect ne fonctionnent automatiquement que lorsque le protocole redirigé est le même. c'est-à-dire de http à http et https à https.
setFolloRedirect est au niveau de la classe et définit ceci pour toutes les instances de la connexion url, alors que setInstanceFollowRedirects est uniquement pour une instance donnée. De cette façon, nous pouvons avoir un comportement différent pour différentes instances.
J'ai trouvé un très bon exemple ici http://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/
la source
Une autre option peut être d'utiliser Apache HttpComponents Client :
Exemple de code:
la source
HTTPUrlConnection n'est pas responsable de la gestion de la réponse de l'objet. C'est des performances comme prévu, il saisit le contenu de l'URL demandée. C'est à vous l'utilisateur de la fonctionnalité d'interpréter la réponse. Il n'est pas capable de lire les intentions du développeur sans spécification.
la source