如何在Java中将Proximo用作SOCKS代理?

时间:2014-02-19 16:47:25

标签: java heroku proxy socks

我有一个在Heroku上运行的Java应用程序,需要访问Salesforce,它只允许从您列入白名单的IP访问API。 Proximo是一个Heroku附加组件,允许您通过具有静态IP的单个服务器代理您的应用程序所做的所有请求。不幸的是,执行此操作的标准方法是running your app within Proximo's wrapper - 为我的应用的网络服务器as it seems to for a number of folks创建了一个监听套接字。

如何在我的Java应用程序中将Proximo用作SOCKS代理?

2 个答案:

答案 0 :(得分:2)

我查看了stacklet他们分发的上述包装器,并看到它作为SOCKS代理连接到Proximo服务器。这在Java中很容易做到,所以我将其添加到我的应用程序的启动中(Groovy语法):

URL proximo = new URL(System.getenv('PROXIMO_URL')
String userInfo = proximo.getUserInfo()
String user = userInfo.substring(0, userInfo.indexOf(':'))
String password = userInfo.substring(userInfo.indexOf(':') + 1)
System.setProperty('socksProxyHost', proximo.getHost())
System.setProperty('socksProxyPort', '1080')
Authenticator.setDefault(new ProxyAuth(user, password))

使用ProxyAuth作为其他地方的内部类:

private class ProxyAuth extends Authenticator {
    private PasswordAuthentication passwordAuthentication;

    private ProxyAuth(String user, String password) {
        passwordAuthentication = new PasswordAuthentication(user, password.toCharArray())
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return passwordAuthentication;
    }
}

答案 1 :(得分:0)

这里介绍了哪种基于Java的Web应用程序?我有一个基于 Spring MVC 的Web应用程序,遇到了与此处提到的相同的问题。

我尝试了两种在我的应用中配置SOCKS代理的方法:

  1. 使用命令行JVM args。
  2. 使用此处提到的java代码,包含在我加载到根应用程序上下文中的Bean中。
  3. 我的Java类加载为bean:

    package be.example.backend.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.net.Authenticator;
    import java.net.MalformedURLException;
    import java.net.PasswordAuthentication;
    import java.net.URL;
    
    public class ProximoSocksConfig {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(ProximoSocksConfig.class);
        private static final String PROXIMO_ENV_VAR = "PROXIMO_URL";
        private static final String PROXIMO_PORT = "1080";
    
        public ProximoSocksConfig() throws MalformedURLException {
            setup();
        }
    
        /**
         * Setup Proximo proxying
         *
         * @return True if Proximo was configured, false if the Proximo environment variable was not found
         */
        public static boolean setup() throws MalformedURLException {
    
            String proximoUrl = System.getenv(PROXIMO_ENV_VAR);
    
            if (proximoUrl != null) {
                URL proximo = new URL(proximoUrl);
    
                String userInfo = proximo.getUserInfo();
                String user = userInfo.substring(0, userInfo.indexOf(':'));
                String password = userInfo.substring(userInfo.indexOf(':') + 1);
                String host = proximo.getHost();
    
                System.setProperty("socksProxyHost", host);
                System.setProperty("socksProxyPort", PROXIMO_PORT);
    
                Authenticator.setDefault(new ProxyAuth(user, password));
                LOGGER.info("{} specified; using <{}:{}> {}:{} as SOCKS proxy", PROXIMO_ENV_VAR, user, password, host,
                        PROXIMO_PORT);
                return true;
            }
    
            LOGGER.info("{} environment variable not set", PROXIMO_ENV_VAR);
            return false;
        }
    
        private static class ProxyAuth extends Authenticator {
    
            private final PasswordAuthentication passwordAuthentication;
    
            private ProxyAuth(String user, String password) {
                passwordAuthentication = new PasswordAuthentication(user, password.toCharArray());
            }
    
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return passwordAuthentication;
            }
        }
    }
    

    基于XML的根应用程序上下文

    <!-- Proximo SOCKS proxy configuration -->
    <bean id="proximoSocksConfig" class="be.example.backend.configuration.ProximoSocksConfig"/>
    

    我没有得到绑定错误,因为不再使用proximo二进制包装器,但是我的应用程序无法在Proximo提供的公共IP地址上访问(我使用Proximo Starters 包)。