2013-04-10 12 views
12

Netzwerkumgebung:
Wie wird HttpsURLConnection über den Proxy von setProperty verwendet?

Https-Client < =============> Proxy Server < ==============> HTTPS-Server
                                                                                                    192.168.17.11 < ----- Extranet ------> 192.168.17.22
10.100.21.10 < ---- Intranet -----> 10.10 0.21.11

ps: Http-Client ohne Standard-Gateway, aber es kann zu 10.100.21.11

Beschreibung ping:

OS:
Https-Client Ubuntu 12.04 auf 3-Hosts: Implementieren Sie mit Java (openjdk-6). Haben Sie eine Netzwerkschnittstelle.
Proxy-Server: Apache2.2.Have zwei Netzwerk-Schnittstellen.
Https Server: Tomcat6.Have eine Netzwerkschnittstelle.

ich zwei Verfahren HttpsURLConnection über Proxy implementieren:
(Für erleichtern Ich schreibe nicht über ssl Griff Funktion den für die Kontrolle serverTrusted und hostnameVerifier issue.If muss ich aktualisieren.
)

1.Proxy Klasse

InetSocketAddress proxyInet = new InetSocketAddress("10.100.21.11",80); 
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyInet); 
URL httpsUrl = new URL("https://192.168.17.22:8443/test"); 
HttpsURLConnection httpsCon = (HttpsURLConnection) httpsUrl.openConnection(proxy); 

httpsCon.setDoOutput(true); 
httpsCon.setDoInput(true); 
httpsCon.setRequestMethod("POST"); 
OutputStream out = httpsCon.getOutputStream(); 
OutputStreamWriter owriter = new OutputStreamWriter(out); 

owriter.write("<request>test</request>"); 
owriter.flush(); 
owriter.close(); 
... 

Diese Methode funktioniert und ich beobachtete Pakete fließen auch meine Erwartungen erfüllt.
Httpclient ---> Proxy Server ---> Httpserver

Aber wenn ich gesetzt Objektmethode:

2.setProperty

System.setProperty("http.proxySet", "true"); 
System.setProperty("http.proxyHost",10.100.21.11); 
System.setProperty("http.proxyPort","80"); 

URL httpsUrl = new URL("https://192.168.17.22:8443/test"); 
HttpsURLConnection httpsCon = (HttpsURLConnection)httpsUrl.openConnection(); 

httpsCon.setDoOutput(true); 
httpsCon.setDoInput(true); 
httpsCon.setRequestMethod("POST"); 
OutputStream out = httpsCon.getOutputStream(); 
OutputStreamWriter owriter = new OutputStreamWriter(out); 

owriter.write("<request>test</request>"); 
owriter.flush(); 
owriter.close(); 
... 

ich ein NoRouteToHostException: Network is unreachable bekam.
Es macht mich verwirrt.Ich habe keine Pakete zwischen HttpClient und ProxyServer gesehen.
Aber Httpclient kann Proxy Server (10.100.12.10 ping 10.100.21.11) ping

ich Proxy-Einstellung So entfernen (wie ohne Proxy):
bekam auch NoRouteToHostException: Network is unreachable.
Ich dachte, das ist vernünftig. Weil es keinen Weg zum Extranet gibt.

Ich denke, es wie zu setProperty Methode scheint, dass die innere Funktion von HttpsURLConnection wird diese URL überprüfen erreichbar sein oder nicht.

Aber es ist seltsam. 1. Methode kann Erfolg sein.

Haben Sie eine Idee? Oder was unterscheidet zwischen 1. und 2. Methode?

+++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++

aktualisieren

System.setProperty("https.proxyHost",10.100.21.11); 
System.setProperty("https.proxyPort","80"); 

kann es funktionieren und Pakete fließen korrekt sind, was ich erwarte.
Aber gesetzt https.proxyPort = 443 nicht praktikabel ist für mich

System.setProperty("https.proxyPort","443"); 

Es wird als Gebrüll eine Ausnahme thorow:

java.net.SocketException: Unexpected end of file from server 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770) 
.... 

Also dachte ich, Apache Proxy haben auch an der richtigen Konfiguration geändert werden .

+0

gibt es keine solche Eigenschaft als http .proxySet. – EJP

+0

ja. Diese Eigenschaft muss nicht gesetzt werden. Danke! ~ – CJeremy

Antwort

13

Ihre URL-Verbindung ist https, während Sie nur den http-Proxy festlegen.

Versuchen Sie, den https-Proxy festzulegen.

//System.setProperty("https.proxySet", "true"); 
System.setProperty("https.proxyHost",10.100.21.11); 
System.setProperty("https.proxyPort","443"); 

EDIT @EJP ist richtig. Es gibt kein https.proxySet .. Ich habe Ihre ursprüngliche Frage kopiert und in die Antwort aufgenommen.

+0

Es gibt keine Eigenschaft wie https.proxySet. – EJP

+0

Ich denke, das ist die richtige Antwort beim Senden einer Anfrage "https" URL. Der Schlüssel von setProperty ist https.proxyHost/proxyPort anstelle von http.proxyHost/porxyPort. – CJeremy

7

Sie müssen ein Proxy Objekt dafür erstellen. Erstellen Sie ein wie folgt:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, Integer.parseInt(proxyPort))); 

Jetzt diesen Proxy verwenden, um die HttpURLConnection Objekt zu erstellen.

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy); 

Wenn Sie die Anmeldeinformationen für den Proxy eingestellt haben, stellen Sie die Proxy-Authorization Anfrage Eigenschaft:

String uname_pwd = proxyUsername + ":" + proxyPassword 
String authString = "Basic " + new sun.misc.BASE64Encoder().encode(uname_pwd.getBytes()) 
connection.setRequestProperty("Proxy-Authorization", authString); 

Und schließlich Sie verbinden:

connection.connect(); 
+0

Vielen Dank für Ihre Antwort. Zuerst verwende ich 1st Methode erstellt ein Proxy-Objekt und es ist für mich praktikabel. Zweitens, die URL, was ich brauche, ist "https", also denke ich, HttpsURLConnection zu verwenden ist korrekt. – CJeremy