Una richiesta Java può incontrare diversi input proxy: configurazione esplicita del client, selettore predefinito, proprietà di rete della JVM e impostazioni supportate del sistema operativo. Quando un log menziona SOCKS in modo inatteso, individua quale input lo ha scelto.

Per il codice che usa il selettore predefinito, ispeziona la decisione per la destinazione esatta:

URI target = URI.create("https://example.com/");
ProxySelector selector = ProxySelector.getDefault();
if (selector != null) {
    System.out.println(selector.select(target));
}

Questo riporta i candidati del selettore. Non dimostra quale connessione sia riuscita alla fine, e un client con un proprio percorso esplicito può fare una scelta diversa.

Controlla le impostazioni effettive

Esamina http.proxyHost, https.proxyHost, socksProxyHost, le loro porte e java.net.useSystemProxies. La documentazione sulle proprietà di rete del JDK descrive la loro portata e precedenza. L'individuazione del proxy di sistema viene verificata all'avvio; impostala deliberatamente all'avvio della JVM.

Le risposte storiche descrivono combinazioni specifiche di vecchie finestre di dialogo di Windows e vecchi JDK. Quei resoconti possono spiegare l'origine di una soluzione, ma non dimostrano che un runtime attuale abbia lo stesso bug. Registra la versione del runtime e l'output del selettore prima di modificare le impostazioni del sistema operativo per ogni applicazione.

Se l'applicazione necessita di un proxy HTTP per un client, una configurazione proxy esplicita può rendere più chiaro tale requisito. Se necessita di routing automatico centralizzato, indaga perché il selettore ha ricevuto o restituito la voce SOCKS inattesa.

Un selettore personalizzato dovrebbe preservare le esclusioni intenzionali e la gestione degli errori. Filtrare indiscriminatamente tutti i candidati SOCKS può interrompere connessioni che dovevano usarne uno. Correggi la regola errata con l'ambito più ristretto che riesci a individuare.

Articoli correlati