web-dev-qa-db-ja.com

Windowsプロキシを自動的に使用するようにJVM / JREを設定する

JVMのプロキシの設定に関する質問はありましたが、(Windowsで)すでに構成されているプロキシをどのように利用できるかについて質問します。

ここに私の問題のデモンストレーションがあります:

  1. コントロールパネル-> Javaに移動し、プロキシアドレスを設定します。
  2. 次の簡単なアプレットコードを実行します(私はEclipse IDEを使用しています)。
import Java.awt.Graphics;
import javax.swing.JApplet;
import Java.util.*;

public class Stacklet extends JApplet {
    private String message;
    public void init(){
        Properties props = System.getProperties();
        message = props.getProperty("http.proxyHost", "NONE");      
        message = (message.length() == 0)? "NONE": message;
    }

    public void Paint(Graphics g)
    {
        g.drawString(message, 20, 20);
    }
}

Javaコントロールパネル)に配置した設定に関係なく、アプレットは「NONE」を表示します。Windowsプロキシ設定(通常はInternet Explorerで設定)が私は判断することができましたが、Javaコントロールパネルで追加の構成手順を実行することは、依然として許容できる解決策でしょう。

ありがとう!

31
t3rse

ProxySelector クラスを使用してプロキシを検出し、環境変数を SystemクラスのsetPropertyメソッド で割り当てることにより、システムプロキシを割り当てることができます。

System.setProperty("Java.net.useSystemProxies", "true");
System.out.println("detecting proxies");
List l = null;
try {
    l = ProxySelector.getDefault().select(new URI("http://foo/bar"));
} 
catch (URISyntaxException e) {
    e.printStackTrace();
}
if (l != null) {
    for (Iterator iter = l.iterator(); iter.hasNext();) {
        Java.net.Proxy proxy = (Java.net.Proxy) iter.next();
        System.out.println("proxy type: " + proxy.type());

        InetSocketAddress addr = (InetSocketAddress) proxy.address();

        if (addr == null) {
            System.out.println("No Proxy");
        } else {
            System.out.println("proxy hostname: " + addr.getHostName());
            System.setProperty("http.proxyHost", addr.getHostName());
            System.out.println("proxy port: " + addr.getPort());
            System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
        }
    }
}
38
t3rse

ここで提案されたコードを試す奇妙な動作を見つけました。

デフォルトのProxySelectorが設定された後、socksサーバーを使用しようとするため、通常のソケットコード(たとえば、新しいSocketの作成)が機能しなくなったように見えます(理由はわかりませんが、私にとってはそうです)。 。

だから、あなたが電話するとき

Socket socket = new Socket(Host, port);

あなたはそのようなSocketExceptionを受け取ります:

Java.net.SocketException: Malformed reply from SOCKS server
    at Java.net.SocksSocketImpl.readSocksReply(Unknown Source)
    at Java.net.SocksSocketImpl.connect(Unknown Source)
    at Java.net.Socket.connect(Unknown Source)
    at Java.net.Socket.connect(Unknown Source)
    at Java.net.Socket.<init>(Unknown Source)
    at Java.net.Socket.<init>(Unknown Source)

次に、デフォルトのProxySelectorをnullに戻します。

ProxySelector.setDefault(null);

私にとってこれは次の小さなJavaクラスを使用しました。これは、アプリケーションのSockets()の使用に影響を与えずにシステムのプロキシ設定を取得するために使用しますが、システムを適切に構成します。プロキシを使用するには:

public class ProxyConfig {

  private static String Host;
  private static int port;

  public static void init() {
    System.setProperty("Java.net.useSystemProxies", "true");
    Proxy proxy = getProxy();
    if (proxy != null) {
      InetSocketAddress addr = (InetSocketAddress) proxy.address();
      Host = addr.getHostName();
      port = addr.getPort();

      System.setProperty("Java.net.useSystemProxies", "false");
      System.setProperty("http.proxyHost", Host);
      System.setProperty("http.proxyPort", ""+port);

    }
    System.setProperty("Java.net.useSystemProxies", "false");
  }

  public static String getHost() {
    return Host;
  }

  public static int getPort() {
    return port;
  }

  private static Proxy getProxy() {
    List<Proxy> l = null;
    try {
      ProxySelector def = ProxySelector.getDefault();

      l = def.select(new URI("http://foo/bar"));
      ProxySelector.setDefault(null);
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (l != null) {
      for (Iterator<Proxy> iter = l.iterator(); iter.hasNext();) {
        Java.net.Proxy proxy = iter.next();
        return proxy;
      }
    }
    return null;
  }
}
10
Flo

これは少し遅いかもしれませんが、同じ問題に遭遇します。私が修正した方法は、jvm引数として-Djava.net.useSystemProxies = trueを使用することです。

「このプロパティは起動時に一度だけチェックされることに注意してください。」

このプロパティは起動時に設定されるため、アプリケーションを実行しても変更されません。

これがお役に立てば幸いです。

リファレンス: https://docs.Oracle.com/javase/7/docs/api/Java/net/doc-files/net-properties.html

Java.net.URL.openStream()Java.net.URL.openConnection().getInputStream()の省略形です。

4
Hrvoje

PDATE:以下のソリューションを機能させるには、システムプロパティJava.net.useSystemProxiestrueに設定する必要があります。

Java.net.URL.openStream()を使用してWebリソースコンテンツのInputStreamを取得すると、そのURLにInternet Explorerが使用するのと同じプロキシが自動的に取得されます。

Javaコントロールパネルに移動したり、使用されているプロキシを表示したりする必要はありません。

2
Alain O'Dea
try{
    System.setProperty("Java.net.useSystemProxies", "true");
    String prx = ProxySelector.getDefault().select(new URI("http://www.google.com")).get(0).address().toString();
    JOptionPane.showMessageDialog(null, prx);
} catch(Exception e){
    JOptionPane.showMessageDialog(null, "no proxy");
}
1
Mahdi