Proxydaten löschen?

MitsuRonin

Mitglied
Ich nutze derzeit das WebView von JavaFX, um einen Browser innerhalb der Anwendung zu implementieren.

Da die Anwendung für mehrere Benutzer gedacht ist, ergibt sich folgendes Problem:

Beim Öffnen des Browser prüfe ich, ob schon Proxydaten gesetzt sind:

Java:
if(System.getProperty("http.proxyUser") == null 
            || System.getProperty("http.proxyUser").length() == 0 
            || System.getProperty("http.proxyPassword") == null 
            || System.getProperty("http.proxyPassword").length() == 0)
        {

Daraufhin öffne ich einen Dialog und speichere die eingegeben Daten dann:

Java:
final String authUser = map.getString("PROXYUSR");
                        final String authPassword = map.getString("PROXYPWD");
                        Authenticator.setDefault(
                            new Authenticator() {
                               @Override
                            public PasswordAuthentication getPasswordAuthentication() {
                                  return new PasswordAuthentication(
                                        authUser, authPassword.toCharArray());
                               }
                            }
                         );
                        
                        System.setProperty("http.proxyUser", authUser);
                        System.setProperty("http.proxyPassword", authPassword);

Jetzt muss ich natürlich sicherstellen, dass diese Daten gelöscht werden, wenn der Benutzer wechselt. Deswegen passiert beim Ausloggen folgendes:

Java:
    	//Reset entered proxy information for the user
    	System.setProperty("http.proxyUser", "");
        System.setProperty("http.proxyPassword", "");
        Authenticator.setDefault(null);

Das funktioniert aber leider nicht richtig. Zwar geht dann beim Öffnen des Browser-Frames wieder der Dialog auf (weil die beiden Systemeigenschaften wieder ein Leerstring sind), aber wenn ich dann den Eingabedialog ohne Eingaben schließe (und damit auch keinen neuen Default-Authenticator setze), dann kommt der Browser trotzdem "durch" den Proxy.

Irgendwo scheint er also trotzdem noch die Proxydaten abgelegt zu haben...nur wo?
 
Zuletzt bearbeitet:

FArt

Top Contributor
Wann wird WebView instanziiert? Mit WebView wird eine Instanz von WebEngine instanziiert. Ich habe mir den Code jetzt nicht angeschaut, aber ich könnte mir vorstellen, dass genau in dem Moment auch die Systemproperties ausgewertet werden.

Systemproperties sind in der Regel nicht zum an- und ausschalten gedacht. Es kann durchaus auch sein, dass die Konfiguration nur einmalig ausgewertet wird. Aber wie gesagt: dazu habe ich nicht im Code nachgeschaut. Kannst du aber mal machen.

Vermutlich klappt es, wenn du für jeden Benutzer eine neue Instanz von WebView erstellst (und somit eine neue Instanz von WebEngine).
 

MitsuRonin

Mitglied
Hallo und vielen Dank für Deine Antwort.

Der Browser liegt in einem JPanel, das ganz normal geöffnet/geschlossen wird. Bei jedem Öffnen des Panels wird eine neue Instanz von WebView und damit auch von der Engine erstellt.

Ich habe es jetzt erstmal soweit am laufen, indem ich beim Ausloggen des Users zusätzlich die beiden Systemvariablen 'http.proxyHost' und 'http.proxyPort' ablösche und diese erst dann wieder setze, wenn der Benutzer seine Proxydaten eingeben hat.

Allerdings kann er dann auch völlig falsche Angaben machen beim Benutzernamen und Passwort, der Authenticator hat weiterhin die alten Angaben im Bauch und lässt die Anfrage korrekt durch :noe:

Anscheinend ist der Aufruf
Java:
Authenticator.setDefault(null);
doch nicht richtig, obwohl im Kommentar steht, dass damit alle Default-Authenticators abgelöscht werden...
 

FArt

Top Contributor
Anscheinend ist der Aufruf
Java:
Authenticator.setDefault(null);
doch nicht richtig, obwohl im Kommentar steht, dass damit alle Default-Authenticators abgelöscht werden...

Doch. Der Code ist eindeutig (und eindeutig simpel an dieser Stelle). Und es gibt nicht mehrere Default-Authenticators Es gibt einen (aktuellen)... oder keinen.

Systemproperties sind in der Regel nicht zum an- und ausschalten gedacht. Es kann durchaus auch sein, dass die Konfiguration nur einmalig ausgewertet wird. Aber wie gesagt: dazu habe ich nicht im Code nachgeschaut. Kannst du aber mal machen.

Dieser Meinung ist Oracle auch.
Warning: Changing system properties is potentially dangerous and should be done with discretion. Many system properties are not reread after start-up and are there for informational purposes. Changing some properties may have unexpected side-effects.
(siehe System Properties (The Java™ Tutorials > Essential Classes > The Platform Environment) )

Warum überschreibst du im Authenticator die Methode getPasswordAuthentication UND setzt die Systemproperties für Proxy-User und -Passwort? Lass die Systemproperties doch weg. Ich kann mir vorstellen, dass die statisch gehalten werden, wenn sie mal verwendet wurden...

Verlangt die Website (die über den Proxy aufgerufen wird) auch eine Authentifizierung, oder nur der Proxy? Evtl. musst du noch eine Unterscheidung vornehmen...
 

MitsuRonin

Mitglied
Hallo,

ich habe das Programm jetzt soweit umgestellt, dass ich ohne die System-Properties für Benutzername und Passwort des Proxys arbeite und nur den Default-Authenticator setze.

Beim Ausloggen schreibe ich den Default-Authenticator auf null.

Trotzdem ist nach einem erneuten Einloggen eines Benutzers kein Setzen eines neuen Default-Authenticators notwendig, die Anfrage geht dann einfach so durch den Proxy :(

Auch das Setzen eines neuen Default-Authenticators mit völlig falschen Benutzerdaten geht dann durch...

Gruß
Dennis
 

Ähnliche Java Themen


Oben