Java Ausfall der Kommunikation durch web-proxy mit Apache HttpClient
Ich habe einen desktop-client sendet Daten an einen web-server, und ich kann nicht scheinen, um durch den proxy-server.
Update: ich bin immer ein 407 HTTP-Fehler, wenn Sie versuchen zu kommunizieren, durch den proxy.
Beim herunterladen von Daten von meinem web-server ist alles in Ordnung. Sobald der Benutzer konfiguriert den proxy-server (unter Verwendung einer dialog-box, die ich schrieb) funktioniert der download einwandfrei. Aber das hochladen von Daten mit org.apache.http.client.HttpClient nicht funktioniert.
Ich bin der Konfiguration der proxy-server mit code wie diesem nach sammeln die Daten aus einem JDialog.
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", "" + portNumber);
Nun, wenn wir das tun, einfache downloads funktionieren. Zum Beispiel habe ich code, der liest xml-Daten von meinem web-server (siehe unten). Auf das Netzwerk des Kunden den Fehler in meinem catch-block angezeigt wurde, bevor Sie die proxy-Einstellungen wurden konfiguriert und dann lief alles in Ordnung, wenn der richtige proxy eingestellt war.
/**
* Loads a collection of exams from the web site. The URL is determined by
* configuration or registration since it is State specific.
*/
public static int importExamsWS(StringBuilder msg) {
try {
java.net.URL onlineExams = new URL(examURL);
//Parse the XML data from InputStream and store it.
return importExams(onlineExams.openStream(), msg);
}
catch (java.net.UnknownHostException noDNS) {
showError(noDNS, "Unable to connect to proctinator.com to download the exam file.\n"
+ "There is probably a problem with your Internet proxy settings.");
}
catch (MalformedURLException | IOException duh) {
showFileError(duh);
}
return 0;
}
Jedoch, wenn ich versuche zu SENDEN von Daten an den web-server es ist, als ob die proxy-Einstellungen werden ignoriert, und eine IOException wird ausgelöst. Nämlich:
org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused
Jetzt weiß ich, dass port 8080 ist nicht blockiert durch den Kunden in der web-filter denn getestet haben wir die Adresse in einem web-browser.
Hier ist mein code für die überprüfung der Registrierungs-ID vom Benutzer eingegeben:
Update: Jetzt bin ich auch die Einstellung der proxy in dieser Methode.
//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR
public static Registered checkRegistration(int id) throws IOException {
httpclient = new DefaultHttpClient();
Config pref = Config.getConfig(); //stores user-entered proxy settings.
HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort());
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
URIBuilder builder = new URIBuilder();
String path = "/Proctorest/rsc/register/" + id;
try {
builder.setScheme("http").setHost(server).setPort(8080).setPath(path);
URI uri = builder.build();
System.out.println("Connecting to " + uri.toString());
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpclient.execute(httpget);
System.out.println(response.getStatusLine().toString());
if(response.getStatusLine().getStatusCode()==200) {
String msg = EntityUtils.toString(response.getEntity());
GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg);
return Registered.stringToRegistered(msg);
}
else {
GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " +
response.getStatusLine().getStatusCode());
return Registered.ERROR;
}
}
catch(java.net.URISyntaxException bad) {
System.out.println("URI construction error: " + bad.toString());
return Registered.ERROR;
}
}
Ich bin mir fast sicher, dass das problem kommt von der proxy-server-Konfiguration, noch der docs für SystemDefaultHttpClient behaupten, dass es dauert, das System-Eigenschaften für http.proxyHost
und http.proxyPort
. Ich weiß, dass die Eigenschaften sind richtig eingestellt, ich bin aber noch dabei diese Authentifizierung Fehler. Anzeigen der generierten Protokolle von meinem Programm zeigte mir dieses:
checkRegistration INFO: Server response status code to checkRegistration: 407
Wie kann ich dies beheben-Authentifizierung ein Fehler?
- Wie Sie Daten senden? eine POST? eine PUT? ein GET mit Parametern? Sorry, ich kann nicht finden, Ihre Frage.
- Wir verwenden hier ERHALTEN. Andere Methoden, die nicht gezeigt ist verwenden Sie den POST. Im code oben bemerkt HttpGet httpget = new HttpGet(uri);
- Können Sie einen proxy in Ihrem dev-Umgebung, dann auf der dev-Maschine, verwenden Sie die firewall blockiert alle ausgehenden http -, ausser dem proxy?
- Proxy-Konfiguration ist außerhalb meiner Fähigkeiten eingestellt. Ich habe Windows Vista und Apache-Web-server auf meine dev-Maschine. Ist es Osten, um einen proxy?
- Squid ist leicht genug, um set-up. Aber Sie müssen zum einrichten der proxy auf einem separaten Rechner, andernfalls die firewall-Konfiguration ist irrelevant.
- Schicken Sie Ihre Daten als Json?
- Ich bin nicht mit JSON. In dem obigen Beispiel die Registrierung ist nur geschickt als Teil des Pfades. Anderen Methoden nur codieren form von Daten - plain-text. Ich habe auch das senden von Daten durch die Veröffentlichung von xml-und csv-Datei.
- Überprüfen Sie die Aktualisierung. Ich bin immer ein 407 HTTP-Fehler.
- Einfach nur neugierig - ist der proxy-server die Verwendung der basic-oder NTLM-Authentifizierung?
- andere Frage - gibt es irgendeine proxy-server-Informationen angegeben in den browser-Einstellungen?
- Sind Sie proxying über den server (auf einem anderen server) oder du bist über proxy in Ihrer Anwendung?
- Der browser einen proxy-Konfiguration, und ich bin über einen proxy-Konfiguration in meiner app, wie gezeigt, in der code, den ich gepostet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme einen Schuss. Wenn der proxy-server die Standardauthentifizierung verwenden, Sie könnte verwenden Sie das folgende snippet als Beispiel:
Wenn der proxy-server mit NTLM-Authentifizierung, ich glaube nicht, dass NTLM-Unterstützung für alle proxy-server-Versionen (es wird Arbeit für einige NTLM-Authentifizierung in proxy-server-Versionen - überprüfen, ob der proxy ist mit v1 oder v2 von NTLM-Authentifizierung). Für Referenz & Problemumgehungen, können Sie Folgendes überprüfen:
http://hc.apache.org/httpcomponents-client-ga/ntlm.html
http://htmlunit.sourceforge.net/ntlm.html
http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html
Je nach proxy-server, können Sie brauchen, um sich in NTCredentials statt UserPasswordCredentials.
Ich würde auch vorschlagen, dass Sie vielleicht wollen, schauen Sie in Verwendung von wireshark zur Erfassung von Netzwerkpaketen und überprüfen Sie die Antwort von dem proxy-server um absolut sicher zu sein, was das problem verursacht.
Nur der Vollständigkeit halber, da sich diese Frage gefunden wird, die Suche nach JVM http.proxy-Eigenschaften, wenn Sie mit JVM-Infrastruktur, proxy-Benutzernamen und-Kennwörter werden unter Verwendung von :
Aus irgendeinem Grund, Einstellung der Parameter auf der client hat bei mir nicht funktioniert.
Arbeitete aber auf http-Methode.