35

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 コントロール パネルで追加の構成手順を実行することは、依然として許容できる解決策である場合に最適です。

ありがとう!

4

6 に答える 6

39

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()));
        }
    }
}
于 2008-12-19T17:58:09.927 に答える
14

これは少し遅いかもしれませんが、同じ問題に遭遇しました。私がそれを修正した方法は、次のシステム プロパティを追加することです。

-Djava.net.useSystemProxies=true

ここで、このプロパティは起動時に 1 回だけ設定されるため、アプリケーションの実行時に変更できないことに注意してください。https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxiesから:

java.net.useSystemProxies (デフォルト: false) ... このプロパティは起動時に一度だけチェックされることに注意してください。

于 2015-12-10T14:53:04.927 に答える
11

ここで提案されたコードを試してみると、奇妙な動作が見つかりました。

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

ですから、あなたが電話をかけるとき

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;
  }
}
于 2011-08-16T21:43:09.067 に答える
3

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

于 2010-12-07T13:37:48.783 に答える
2

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

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

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

于 2010-09-30T12:43:05.670 に答える