How do I set the proxy to be used by the JVM

前端 未结 19 1602
孤街浪徒
孤街浪徒 2020-11-22 05:51

Many times, a Java app needs to connect to the Internet. The most common example happens when it is reading an XML file and needs to download its schema.

I am behind

相关标签:
19条回答
  • 2020-11-22 06:17

    The following shows how to set in Java a proxy with proxy user and proxy password from the command line, which is a very common case. You should not save passwords and hosts in the code, as a rule in the first place.

    Passing the system properties in command line with -D and setting them in the code with System.setProperty("name", "value") is equivalent.

    But note this

    Example that works:

    C:\temp>java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps.proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit com.andreas.JavaNetHttpConnection
    

    But the following does not work:

    C:\temp>java com.andreas.JavaNetHttpConnection -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit
    

    The only difference is the position of the system properties! (before and after the class)

    If you have special characters in password, you are allowed to put it in quotes "@MyPass123%", like in the above example.

    If you access an HTTPS service, you have to use https.proxyHost, https.proxyPort etc.

    If you access an HTTP service, you have to use http.proxyHost, http.proxyPort etc.

    0 讨论(0)
  • 2020-11-22 06:19

    If you want "Socks Proxy", inform the "socksProxyHost" and "socksProxyPort" VM arguments.

    e.g.

    java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
    
    0 讨论(0)
  • 2020-11-22 06:19

    This is a minor update, but since Java 7, proxy connections can now be created programmatically rather than through system properties. This may be useful if:

    1. Proxy needs to be dynamically rotated during the program's runtime
    2. Multiple parallel proxies need to be used
    3. Or just make your code cleaner :)

    Here's a contrived example in groovy:

    // proxy configuration read from file resource under "proxyFileName"
    String proxyFileName = "proxy.txt"
    String proxyPort = "1234"
    String url = "http://www.promised.land"
    File testProxyFile = new File(proxyFileName)
    URLConnection connection
    
    if (!testProxyFile.exists()) {
    
        logger.debug "proxyFileName doesn't exist.  Bypassing connection via proxy."
        connection = url.toURL().openConnection()
    
    } else {
        String proxyAddress = testProxyFile.text
        connection = url.toURL().openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress, proxyPort)))
    }
    
    try {
        connection.connect()
    }
    catch (Exception e) {
        logger.error e.printStackTrace()
    }
    

    Full Reference: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html

    0 讨论(0)
  • 2020-11-22 06:23

    That works for me:

    public void setHttpProxy(boolean isNeedProxy) {
        if (isNeedProxy) {
            System.setProperty("http.proxyHost", getProxyHost());
            System.setProperty("http.proxyPort", getProxyPort());
        } else {
            System.clearProperty("http.proxyHost");
            System.clearProperty("http.proxyPort");
        }
    }
    

    P/S: I base on GHad's answer.

    0 讨论(0)
  • 2020-11-22 06:24

    You can set some properties about the proxy server as jvm parameters

    -Dhttp.proxyPort=8080, proxyHost, etc.

    but if you need pass through an authenticating proxy, you need an authenticator like this example:

    ProxyAuthenticator.java

    import java.net.*;
    import java.io.*;
    
    public class ProxyAuthenticator extends Authenticator {
    
        private String userName, password;
    
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password.toCharArray());
        }
    
        public ProxyAuthenticator(String userName, String password) {
            this.userName = userName;
            this.password = password;
        }
    }
    

    Example.java

        import java.net.Authenticator;
        import ProxyAuthenticator;
    
    public class Example {
    
        public static void main(String[] args) {
            String username = System.getProperty("proxy.authentication.username");
            String password = System.getProperty("proxy.authentication.password");
    
                    if (username != null && !username.equals("")) {
                Authenticator.setDefault(new ProxyAuthenticator(username, password));
            }
    
                    // here your JVM will be authenticated
    
        }
    }
    

    Based on this reply: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

    0 讨论(0)
  • 2020-11-22 06:25

    To set an HTTP/HTTPS and/or SOCKS proxy programmatically:

    ...
    
    public void setProxy() {
        if (isUseHTTPProxy()) {
            // HTTP/HTTPS Proxy
            System.setProperty("http.proxyHost", getHTTPHost());
            System.setProperty("http.proxyPort", getHTTPPort());
            System.setProperty("https.proxyHost", getHTTPHost());
            System.setProperty("https.proxyPort", getHTTPPort());
            if (isUseHTTPAuth()) {
                String encoded = new String(Base64.encodeBase64((getHTTPUsername() + ":" + getHTTPPassword()).getBytes()));
                con.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
                Authenticator.setDefault(new ProxyAuth(getHTTPUsername(), getHTTPPassword()));
            }
        }
        if (isUseSOCKSProxy()) {
            // SOCKS Proxy
            System.setProperty("socksProxyHost", getSOCKSHost());
            System.setProperty("socksProxyPort", getSOCKSPort());
            if (isUseSOCKSAuth()) {
                System.setProperty("java.net.socks.username", getSOCKSUsername());
                System.setProperty("java.net.socks.password", getSOCKSPassword());
                Authenticator.setDefault(new ProxyAuth(getSOCKSUsername(), getSOCKSPassword()));
            }
        }
    }
    
    ...
    
    public class ProxyAuth extends Authenticator {
        private PasswordAuthentication auth;
    
        private ProxyAuth(String user, String password) {
            auth = new PasswordAuthentication(user, password == null ? new char[]{} : password.toCharArray());
        }
    
        protected PasswordAuthentication getPasswordAuthentication() {
            return auth;
        }
    }
    
    ...
    

    Remember that HTTP proxies and SOCKS proxies operate at different levels in the network stack, so you can use one or the other or both.

    0 讨论(0)
提交回复
热议问题