J2SE代理验证

时间:2009-08-12 20:57:18

标签: java proxy

我们使用2个SIMILAR Microsoft ISA Proxy Server 2003连接到互联网。 每个代理具有不同的登录样式,如下所示:

Server-1:nt-domain \ alan Server-2:alan@love-u.com

通过Wifi登录IE,Firefox和我的Phonecell都很好。 但是,当我们运行java应用程序J2SE Ver 4,5和6时会出现问题, 它需要互联网认证的地方。 登录到Server-2是正常的,但是对于Server-2,则为FAIL(样式:alan@domain.com)。

注意:使用Windows身份验证看到的两个代理都输入:negotiate NTLM

如果您可以提供帮助或任何建议,请致谢。

谢谢,

Alan L

4 个答案:

答案 0 :(得分:3)

java documentation描述了如何在java中启用NTLM身份验证。如果您有权访问源代码,则可以按照"proxy"文章中的说明以编程方式添加系统属性,添加如下内容(另请参见axis2的discussion):

System.setProperty("http.auth.ntlm.domain", mydomain);

如果您无权访问源,则可以在启动java二进制文件的命令行上设置属性,添加如下内容:

java -DproxyHost=host  -DproxyPort=8080  -Dhttp.auth.ntlm.domain=mydomain  ...

答案 1 :(得分:2)

有一些好的库可以帮助您克服这个问题。 Proxy Vole(Java的网络代理自动检测)可以帮助您使用与Internet Explorer相同的代理设置通过代理进行身份验证。

  

要为Java应用程序提供开箱即用的网络连接,您可以使用Proxy-Vole库。它提供了一些自动检测当前代理设置的策略。有许多可配置的策略可供选择。目前,Proxy-Vole支持以下代理检测策略。

     
      
  • 阅读平台设置(支持:Windows,KDE,Gnome)
  •   
  • 阅读浏览器设置(支持:Firefox 3.x,Internet Explorer)
  •   
  • 读取环境变量(Linux / Unix服务器系统上经常使用的变量)
  •   
  • 使用WPAD / PAC自动检测脚本(仅支持某些功能)
  •   

答案 2 :(得分:0)

您是在运行应用程序还是小程序? applet可以依赖浏览器的代理身份验证机制。

我建议先使用cURL连接代理,然后查看发生的握手。代理服务器将为客户端提供一系列身份验证方法。

如果用户和密码已修复,您有时可以从浏览器会话中取出标题,并在代码中使用它。例如,我可以将此标头添加到请求中,代理会将我视为已通过身份验证:

Proxy-Authorization: Basic AbCdEfGhOjk==

答案 3 :(得分:0)

使用apache-commons httpClient(版本3),我有以下代码。它没有经过良好测试(如果它完全没有),但我认为它曾经工作过一次.. :) 这是为了你可以修改程序..如果他们是一些第三方包,你无能为力。


String proxyHost = System.getProperty("https.proxyHost");
                int proxyPort = 0;
                try {
                    proxyPort = Integer.parseInt(System
                            .getProperty("https.proxyPort"));
                } catch (Exception ex) {
                    //
                }

            System.setProperty("java.net.useSystemProxies", "true");

            ProxySelector ps = ProxySelector.getDefault();
            List<Proxy> proxyList = ps.select(new URI(targetUrl));
            Proxy proxy = proxyList.get(0);
            if (proxy != null) {
                InetSocketAddress addr = ((InetSocketAddress) proxy
                        .address());
                if (addr != null) {
                    proxyHost = addr.getHostName();
                    proxyPort = addr.getPort();
                }
            }

            boolean useProxy = proxyHost != null && proxyHost.length() > 0;

            if (useProxy) {
                httpClient.getHostConfiguration().setProxy(proxyHost,
                        proxyPort);
            }